【发布时间】:2017-06-10 23:00:13
【问题描述】:
我想知道这个例子中的线程是如何流动的。有异步事件处理程序,它调用另一个异步方法,该方法有两个等待。我可以这样理解流程吗:
- 1)UI线程调用button1_Click,依次调用LoadStringAsync方法
- 2)LoadStringAsync 首先调用GetFirstNameAsync
- 3)GetFirstNameAsync 返回一个未完成的任务,LoadStringAsync 等待这个任务
- 4) LoadStringAsync 依次返回未完成的任务 button1_Click 等待 LoadStringAsync 返回的 Task
- 5) UI 线程离开 button1_Click。这就是为什么 UI 线程不是 被屏蔽了。
- 6) 当 GetFirstNameAsync 最终完成时,LoadStringAsync 可以 continue,这意味着 UI 线程将再次进入,并执行 下一行是另一个等待。
- 8) GetLastNameAsync 返回一个未完成的任务 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;
}
【问题讨论】:
-
您描述的流程似乎是正确的。无法确定这里是否存在死锁情况,因为您没有提供有关 LoadStringAsync、GetFirstNameAsync 等内容的详细信息。如果那里没有任何阻塞调用,应该没问题。
标签: c# .net asynchronous async-await deadlock