问题不在于 ConfigureAwait 做什么。但更确切地说,为什么我到处都能看到类似的东西
一般来说,是的。除非该方法需要其上下文,否则应为每个等待使用 ConfigureAwait(false)。
即他们建议我应该写
await Method1().ConfigureAwait(false);
await Method2().ConfigureAwait(false);
// Do something else
// ...
await Method3().ConfigureAwait(false);
await Method4().ConfigureAwait(false);
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,只在一开始就重置上下文不会更清楚,就像
await Task.Yield().ConfigureAwait(false);
Run Code Online (Sandbox Code Playgroud)
它保证下面的代码将在没有同步上下文的情况下执行,不是吗?
即我读到如果该方法立即返回,则写一次 ConfigureAwait 可能不起作用。对我来说,显而易见的解决方案看起来像调用 ConfigureAwait(false) 肯定不会立即返回的东西,Task.Yield 是什么,对吧?
另外我知道 Task.Yield 不再包含 ConfigureAwait(不知道为什么,因为我知道它以前曾经有它),但是查看 Task.Yield 代码很容易编写自己的方法除了用空的同步上下文调用延续之外,什么都不做。
对我来说,阅读似乎要容易得多,尤其是当你写一次的时候写
await TaskUtility.ResetSyncContext();
Run Code Online (Sandbox Code Playgroud)
而不是在每一行上写 ConfigureAwait。
这会起作用(Task.Yield().ConfigureAwait(false) 或类似的自定义方法)还是我错过了什么?