c# - ConfigureAwait(false) 在这里实现了什么

标签 c# task

如果在图书馆我有这个

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/

相关文章:

c# - wcf 基于任务的异步模式

c# - 如何在 iTextSharp 中旋转文本?

c# - 使用 Simple.Data 更新列表

java - 如何在Android中备份备忘录和任务

Android 在清除其他 Activity 的同时推送一个新 Activity

android - 任务 killer 如何工作?

C# Roslyn 编译器 - 如何从 IdentifierNameSyntax 获取类型的命名空间?

c# - 是否有可能无法从任务延续中触发 AppDomain 的未处理异常处理程序?

c# - 为 Label 控件创建 KeyDown 事件处理程序

c# - 链式 C# 任务延续中的任务异常为空