当我不能使用ConfigureAwait(false)?

时间:2015-09-03 13:28:37

标签: c# .net asynchronous async-await task-parallel-library

根据最佳做法,如果可以,建议您使用$.office.generators[?(@.make == 'Broom Broom')] .ConfigureAwait(false)个关键字:

async/await

如果我无法使用await Task.Run(RunSomethingAsync).ConfigureAwait(false); ,请举例说明情况吗?

2 个答案:

答案 0 :(得分:11)

当你真正关心你所处的同步上下文时,你“不能”使用ConfigureAwait(false)。例如,想象一下GUI应用程序中的以下内容:

public async void SomeButtonClick(object sender, EventArgs e)
{
    var result = await SomeAsyncOperation().ConfigureAwait(false);
    textBox.Text = result;
}

当你从ConfigureAwait返回时,你不会回到UI线程上。这将导致InvalidOperationException

答案 1 :(得分:1)

来自source: Asynchronous .NET Client Libraries for Your HTTP API and Awareness of async/await's Bad Effects

  

当您在等待关键字,编译器的方法上等待时   代表您生成一堆代码。其中一个目的   action是处理与UI(或主)线程的同步。钥匙   此功能的组件是SynchronizationContext.Current   获取当前线程的同步上下文。   SynchronizationContext.Current的填充取决于   你所处的环境。任务的GetAwaiter方法可以查找   SynchronizationContext.Current。如果是当前同步上下文   不为null,传递给该awaiter的延续将得到   回发到同步上下文。

     

使用新方法时使用新的异步语言   功能,以阻塞的方式,你最终会遇到死锁   你有一个可用的SynchronizationContext。当你消费时   阻塞方式的这些方法(等待任务等待   方法或直接从结果属性中获取结果   任务),您将同时阻止主线程。什么时候   最终,任务在线程池中的该方法内完成,它   将调用延续回发到主线程   因为SynchronizationContext.Current可用并已捕获。但   这里有一个问题:UI线程被阻止,你有一个   死锁!