根据最佳做法,如果可以,建议您使用$.office.generators[?(@.make == 'Broom Broom')]
.ConfigureAwait(false)
个关键字:
async/await
如果我无法使用await Task.Run(RunSomethingAsync).ConfigureAwait(false);
,请举例说明情况吗?
答案 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)
当您在等待关键字,编译器的方法上等待时 代表您生成一堆代码。其中一个目的 action是处理与UI(或主)线程的同步。钥匙 此功能的组件是
SynchronizationContext.Current
获取当前线程的同步上下文。SynchronizationContext.Current
的填充取决于 你所处的环境。任务的GetAwaiter
方法可以查找SynchronizationContext.Current
。如果是当前同步上下文 不为null,传递给该awaiter的延续将得到 回发到同步上下文。使用新方法时使用新的异步语言 功能,以阻塞的方式,你最终会遇到死锁 你有一个可用的SynchronizationContext。当你消费时 阻塞方式的这些方法(等待任务等待 方法或直接从结果属性中获取结果 任务),您将同时阻止主线程。什么时候 最终,任务在线程池中的该方法内完成,它 将调用延续回发到主线程 因为
SynchronizationContext.Current
可用并已捕获。但 这里有一个问题:UI线程被阻止,你有一个 死锁!