C#里await Task.Run死锁的分析与解决
一段如下的代码,它是必然死锁的:
private void button1_Click(object sender, EventArgs e)
{
Task<string> res = GetResAsync();
textBox1.Text = res.Result;
}
private async Task<string> GetResAsync()
{
string t = await Task.Run(() => {
Thread.Sleep(1000);
return "返回结果1";
});
return t;
}
在这段代码里,GetResAsync()函数是使用await Task.Run来等线程任务执行返回一个字符串结果。
因此在textBox1.Text = res.Result里想获取结果显示。
那么就需要执行res.Result。
执行res.Result时,需要等线程执行结果,它采用一个wait函数等线程完成。
因为在前面await Task.Run已经在等线程去执行,这时就会造成死锁。
要解决上述的问题,只有两