c# - 库中的 ConfigureAwait(false) 是否会丢失调用应用程序的同步上下文?

标签 c# .net async-await task-parallel-library

我从比我聪明的人那里读过很多次建议,其中很少有警告:始终在库代码中使用 ConfigureAwait(false)。所以我相当确定我知道答案,但我想成为 100%。场景是我有一个库,它薄薄地包装了一些其他异步库。

库代码:

public async Task DoThingAsyc() {
    // do some setup
    return await otherLib.DoThingAsync().ConfigureAwait(false);
}

申请代码:

// need to preserve my synchronization context
await myLib.DoThingAync();
// do I have my context here or did my lib lose it?

最佳答案

没有。

SynchronizationContext 的捕获发生在 await 上。 ConfigureAwait 配置特定的await

如果应用程序调用库的异步方法并等待它,则无论调用中发生什么,SC 都会被当场捕获。

现在,因为异步方法的同步部分(即第一个 await 之前的部分)是在任务返回等待之前执行的,所以您可以乱用 SynchronizationContext 在那里,但是 ConfigureAwait 不这样做。


在您的具体示例中,您似乎从异步方法返回 ConfigureAwait 的结果。这不可能发生,因为 ConfigureAwait 返回 ConfiguredTaskAwaitable 结构。但是,如果我们更改方法返回类型:

public ConfiguredTaskAwaitable DoThingAsyc() 
{
    return otherLib.DoThingAsync().ConfigureAwait(false);
}

然后等待它确实会影响调用代码的等待行为。

关于c# - 库中的 ConfigureAwait(false) 是否会丢失调用应用程序的同步上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32542861/

相关文章:

c# - 是否可以使用 .NET 异步方法获得良好的堆栈跟踪?

c# - Visual Studio 2015 - EnvDTE 读取错误列表

c# - 从 C# 3.0 中的匿名委托(delegate)返回

.net - 如何 : set A4 size in a WPF usercontrol?

c# - morpho (safran) 生物识别扫描仪设备的 SDK

javascript - 将 async await 与 babel 一起使用时出现意外 token

c# - 异步等待使用和开销

c# - 线程本地存储内存使用

c# - ASP.NET MVC 5 Bootstrap 按钮移动到另一个 View 页面

.net - Thread.Sleep()与Monitor.Wait/Monitor.Pulse