如果在图书馆我有这个
public async DoSomething()
{
await Foo();
}
然后我将其称为lib.DoSomething().ConfigureAwait(false).GetAwaiter().GetResult()
这会给我带来与图书馆最初的
相同的好处吗?public async DoSomething()
{
await Foo().ConfigureAwait(false);
}
答案 0 :(得分:2)
不,它不会给你同样的好处。如果你有:
public async Task DoSomething()
{
await Foo();
}
然后再做
lib.DoSomething().ConfigureAwait(false).GetAwaiter().GetResult()
例如,来自WPF应用程序中的UI线程 - 您将陷入僵局。在await Foo()
之前,您使用的是UI线程(有特定于WPF的SynchronizationContext.Current
),等待之后您将尝试返回UI线程。 UI线程在GetResult()
上被阻止,因此会导致死锁。实际上,ConfigureAwait(false)
在这里没用。
如果另一方面你有
public async Task DoSomething()
{
await Foo().ConfigureAwait(false);
}
并且做了
lib.DoSomething().GetAwaiter().GetResult()
不会发生死锁,因为ConfigureAwait(false)
专门告诉不要“继续捕获上下文”,所以不要返回SynchronizationContext
(在这种情况下是UI线程)。