首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我不能使用ConfigureAwait(假)时?

当我不能使用ConfigureAwait(假)时?
EN

Stack Overflow用户
提问于 2015-09-03 13:28:37
回答 2查看 913关注 0票数 8

根据最佳实践,如果可以的话,建议将.ConfigureAwait(false)async/await关键字结合使用:

代码语言:javascript
复制
await Task.Run(RunSomethingAsync).ConfigureAwait(false);

你能给我举个例子,说明我不能使用.ConfigureAwait(false)的情况吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-03 13:32:17

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

代码语言:javascript
复制
public async void SomeButtonClick(object sender, EventArgs e)
{
    var result = await SomeAsyncOperation().ConfigureAwait(false);
    textBox.Text = result;
}

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

票数 11
EN

Stack Overflow用户

发布于 2015-09-03 13:39:28

来自来源: HTTP的异步.NET客户端库和异步/等待的不良影响意识

当您在等待方法时,编译器代表您生成一堆代码。此操作的目的之一是处理与UI (或main)线程的同步。此特性的关键组件是SynchronizationContext.Current,它获取当前线程的同步上下文。SynchronizationContext.Current的填充取决于您所处的环境。任务的GetAwaiter方法查找SynchronizationContext.Current。如果当前同步上下文不是null,则传递给该服务生的延续将被回发回该同步上下文。 当以阻塞的方式使用使用新异步语言特性的方法时,如果您有可用的SynchronizationContext,将导致死锁。当您以阻塞方式使用这些方法(使用等待方法等待任务或直接从任务的结果属性获取结果)时,您将同时阻塞主线程。当任务最终在线程池中的方法中完成时,它将调用延续,回发到主线程,因为SynchronizationContext.Current是可用的和捕获的。但是这里有一个问题: UI线程被阻塞了,并且您有一个死锁!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32377028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档