首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多层异步控制流程

多层异步控制流程
EN

Stack Overflow用户
提问于 2017-01-25 16:47:39
回答 1查看 138关注 0票数 0

我想知道这个例子中的线程是如何运行的。有异步事件处理程序,它调用另一个异步方法,它有两个等待。我能理解这样的流程吗?

  • 1)UI线程调用button1_Click,然后调用LoadStringAsync方法
  • 2)LoadStringAsync首先调用GetFirstNameAsync
  • 3)GetFirstNameAsync返回未完成的任务,LoadStringAsync等待此任务
  • 4) LoadStringAsync依次返回未完成的任务,button1_Click等待LoadStringAsync返回的任务
  • 5) UI线程离开button1_Click。这就是UI线程未被阻塞的原因。
  • 6)当GetFirstNameAsync最终完成时,LoadStringAsync可以继续,这意味着UI线程将再次进入,并执行下一行,这是另一个等待。
  • 8) GetLastNameAsync返回未完成的任务,LoadStringAsync等待GetLastNameAsync返回的任务
  • 9) button1_Click正在等待LoadStringAsync返回的任务
  • 10) UI线程再次离开button1_Click,并执行其他操作。
  • 11)同一步骤重复。

我的假设正确吗?或者说这里出现了僵局。

代码语言:javascript
运行
复制
private async void button1_Click(object sender, RoutedEventArgs e) 
{ 
string s = await LoadStringAsync(); 
textBox1.Text = s; 
}

static async Task<string> LoadStringAsync() 
{ 
string firstName = await GetFirstNameAsync(); 
string lastName = await GetLastNameAsync(); 
return firstName + ” ” + lastName; 
}
EN

回答 1

Stack Overflow用户

发布于 2017-01-25 17:53:34

你的流量几乎是正确的。只有一个修改:方法不可能返回两次(步骤4和步骤9)。因为LoadStringAsync已经返回了一个未完成的任务,所以它直接返回到第二个await的UI线程。

在您提供的代码中没有死锁。

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

https://stackoverflow.com/questions/41857099

复制
相关文章

相似问题

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