我从比我聪明的人那里读过很多次建议,其中很少有警告:始终在库代码中使用 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/