Task.Result卡死問題

在如下代碼中:

public async Task<string> GetData()
{
  return await DoWork();
}

在UI線程中調用

var data = GetData().Result;

此時線程會卡死;

兩種解決辦法:

1,所有調用方法鏈中使用async、await方式調用。

var data = await GetData().

2, 去掉調用鏈中的async,await,直接返回Task類型。

public Task<string> GetData()
{
  return DoWork();
}

 

原因 Task.Result會直接阻塞當前調用線程,而aysnc、await機制是使用狀態機切換上下文,

當調用.Result時,當前線程阻塞,async、await狀態機無法切換回線程上下文,導致死鎖。

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