如果在图书馆我有这个
public async DoSomething()
{
await Foo();
}
然后我将其称为 lib.DoSomething().ConfigureAwait(false).GetAwaiter().GetResult()
这会给我带来和图书馆最初拥有的一样的好处吗
public async DoSomething()
{
await Foo().ConfigureAwait(false);
}
最佳答案
不,它不会给您同样的好处。如果你有:
public async Task DoSomething()
{
await Foo();
}
然后做
lib.DoSomething().ConfigureAwait(false).GetAwaiter().GetResult()
例如,从 WPF 应用程序中的 UI 线程 - 您将死锁。在 await Foo()
之前,您处于 UI 线程(有特定于 WPF 的 SynchronizationContext.Current
),在 await 之后,您将尝试返回到 UI 线程。 UI 线程在 GetResult()
上被阻塞,因此会导致死锁。实际上,ConfigureAwait(false)
在这里没有用。
如果另一方面你有
public async Task DoSomething()
{
await Foo().ConfigureAwait(false);
}
然后做
lib.DoSomething().GetAwaiter().GetResult()
不会发生死锁,因为 ConfigureAwait(false)
明确告知不要“继续捕获的上下文”,因此不要返回到 SynchronizationContext
(此中的 UI 线程例)。
关于c# - ConfigureAwait(false) 在这里实现了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48785361/