多层异步控制流

时间:2017-01-25 16:47:40

标签: c# .net asynchronous async-await deadlock

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

  • 1)UI线程调用button1_Click,它依次调用LoadStringAsync方法
  • 2)LoadStringAsync首先调用GetFirstNameAsync
  • 3)GetFirstNameAsync返回未完成的Task,LoadStringAsync 等待这个任务
  • 4)LoadStringAsync依次返回未完成的任务button1_Click 等待LoadStringAsync返回的任务
  • 5)UI线程离开button1_Click。这就是UI线程不是的原因 阻止。
  • 6)当GetFirstNameAsync最终完成时,LoadStringAsync可以 继续,这意味着UI线程将再次进入,并执行 下一行是另一个等待。
  • 8)GetLastNameAsync返回未完成的Task,LoadStringAsync 等待GetLastNameAsync返回的任务
  • 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; 
}

1 个答案:

答案 0 :(得分:1)

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

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