ConfigureAwait(false)在这里是否实现了任何功能

时间:2018-02-14 10:52:22

标签: c# task

如果在图书馆我有这个

public async DoSomething()
{
   await Foo();
}

然后我将其称为lib.DoSomething().ConfigureAwait(false).GetAwaiter().GetResult()

这会给我带来与图书馆最初的

相同的好处吗?
public async DoSomething()
{
   await Foo().ConfigureAwait(false);
}

1 个答案:

答案 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线程)。