首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ConfigureAwait,UI,等待异步

ConfigureAwait,UI,等待异步
EN

Stack Overflow用户
提问于 2021-01-28 08:55:55
回答 1查看 107关注 0票数 0

我有一个小项目-- WinForms On .net frameWork --只是一个小测试:

代码语言:javascript
复制
private void button9_Click(object sender, EventArgs e)
{
    string text = GetTitleAsync().Result;
    button9.Text = text;            
}
private async Task<string> GetTitleAsync()
{
    await Task.Delay(3000);
    return "Hello!";
}

当我运行应用程序时,单击"button9“按钮-导致死锁(因为线程挂在".result”上)

用这种方式编写GetTitleAsync():

代码语言:javascript
复制
private async Task<string> GetTitleAsync()
{
    await Task.Delay(3000).ConfigureAwait(false);
    return "Hello!";
}

解决了僵局--应用程序运行正常。

但我不明白怎么回事?

我原以为,使用".ConfigureAwait(false)“会导致以下情况:

“than on9.text= text;”在与创建UI的线程不同的线程上执行,并且将抛出一个excpetion!

但效果很好!怎么做??

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-28 14:03:33

I本来以为,使用".ConfigureAwait(false)“会导致”.ConfigureAwait 9.Text= text;“在与创建UI的线程不同的线程上执行,并且会被抛出!但效果很好!怎么做??

我建议您阅读我的async/await intro;我尝试将您需要了解的关于async/await及其上下文的所有信息都包括在内,而不需要详细介绍。

具体而言,该职位有两点值得注意:

每个thread.

  • await方法都开始同步执行,除非使用ConfigureAwait(false).

,否则调用将捕获上下文。

所以,我们来看看下面的代码:

代码语言:javascript
复制
private void button9_Click(object sender, EventArgs e)
{
    string text = GetTitleAsync().Result;
    button9.Text = text;            
}

private async Task<string> GetTitleAsync()
{
    await Task.Delay(3000).ConfigureAwait(false);
    return "Hello!";
}

这是按照顺序发生的,并特别注意哪个线程运行哪个代码:

  1. button9_Click调用UI上的GetTitleAsync(),thread.
  2. GetTitleAsync()调用Task.Delay(3000)并返回一个将在3 seconds.
  3. GetTitleAsync() calls ConfigureAwait(false)中完成的任务,并返回一个配置好的侍者,该侍者将不再继续当前(UI) context.
  4. GetTitleAsync()使用await异步等待任务完成。此await将不会在当前(UI)上下文上恢复,因为await已配置为not。
  5. await检查任务并看到它不完成,因此它将一个不完整的Task<string>返回到其在该任务上的await calls .Result。这会阻塞UI线程,直到任务完成(即,executing).
  6. Three几秒钟后GetTitleAsync()就完成了,从Task.Delay(3000) completes.
  7. GetTitleAsync()返回的任务将在await之后恢复执行。因为这是一个配置好的await,所以它继续在线程池上执行,await返回"Hello!"。这是在线程池线程上完成的。
  8. 通过返回一个值,GetTitleAsync()现在完成了,而它先前返回的Task<string>现在用结果值完成了。这个完成也发生在线程池thread.
  9. Since上,任务现在已经完成,UI线程不再被阻塞,并且它继续执行button9_Click.
  10. button9_Click在UI线程上执行button9.Text = text;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65933864

复制
相关文章

相似问题

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