繁体   English   中英

多层异步控制流程

[英]Multi layer async control flow

我想知道本例中的线程流向。 有一个异步事件处理程序,它调用另一个异步方法,该方法有两个等待。 我可以理解这样的流程:

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

我的假设正确吗? 否则这里有僵局。

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; 
}

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

您提供的代码没有死锁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM