異步鎖死

 

異步函數testAsync

private async Task<string> testAsync()
{
await Task.Delay(3000);
return DateTime.Now.ToString();
}

//以下程序調用會鎖死,應該是子函數中的Delay和主函數中的this.Text = t.Result;互相鎖住了

private void button1_Click(object sender, EventArgs e)
{
Task<string> t = this.testAsync();
this.textBox1.Text = DateTime.Now.ToString();
this.Text = t.Result;
this.textBox2.Text = DateTime.Now.ToString();
}

//以下程序可以正常執行

private async void button3_Click(object sender, EventArgs e)
{
this.Text = await this.testAsync();
this.textBox1.Text = DateTime.Now.ToString();
}

//以下程序可以正常執行,就是說調用異步函數時,主函數必須也要await

private void button2_Click(object sender, EventArgs e)
{
Task t= test2();
}

private async Task test2()
{
Task<string> t = this.testAsync();
this.textBox1.Text = DateTime.Now.ToString();
this.Text = await t;
this.textBox2.Text = DateTime.Now.ToString();
}

 

參考:

c# async/await異步編程死鎖的問題 - F風 - 博客園 (cnblogs.com)

c#Async,await編程核心基礎,執行順序,死鎖,使用注意點,_漫遊者碼農的博客-CSDN博客

 

總結:

儘量不要用this.Text = t.Result;得到異步結果,要用await t得到結果。

上面死鎖的原因是當Task.Delay完成後需切回調用線程執行Task.Delay下面的代碼,但原線程卻在this.Text = t.Result;處阻塞了,所以就死鎖了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章