簡體   English   中英

在Task返回函數中調用Task.Result是否會阻塞調用線程

[英]Whether the calling thread will be blocked if Task.Result is called in the Task returning function

我盡量不在我的代碼中創建冗余的Task對象,並且在可能的情況下我編寫了Task返回函數而不是async Task函數。

當需要保存async函數返回的值時,我被迫讓函數返回async Task並使用await調用函數。

例子:

async Task SomeWorkAsync()
{
   someGlobalVariable = await AnotherWorkAsync();
}

我寫的是:

Task SomeWorkAsync()
{
   var task = AnotherWorkAsync();
   someGlobalVariable = task.Result;
   return task;
}

但是我擔心它會像同步代碼一樣阻塞調用線程。

await SomeWorkAsync(); //main thread block

是否有另一種方法可以重寫示例中的代碼,而無需像async關鍵字那樣用 new Task包裝整個函數?

我盡量不在我的代碼中創建冗余的 Task 對象,並且在可能的情況下我編寫了 Task 返回函數而不是異步 Task 函數。

這並不常見,也不是與 TPL 合作的預期方式。

這是錯誤的:

Task SomeWorkAsync()
{
   var task = AnotherWorkAsync();
   someGlobalVariable = task.Result;
   return task;
}

你應該使用

async Task<T> SomeWorkAsync()
{
   someGlobalVariable = await AnotherWorkAsync();
   return someGlobalVariable;
}

只有在嚴格的情況下才應該使用.Result來獲取Task的結果。

如果你想保存自己的狀態機,只需調用

public Task SomeWorkAsync()
{
   ...
   return AnotherWorkAsync();
}

不要調用Result ,只需在方法定義中沒有async關鍵字的情況下返回任務

簡而言之,您只是在返回一個任務,可以在更高處等待

更新

是的,如果 AnotherWorkAsync 是 async Task,這可以解決問題,但在我的情況下,它是 async Task<T>

public Task<MyAwesomeType> SomeWorkAsync()
{
   ...
   return AnotherWorkAsync();
}

更新 2

這仍然不是我的意思。 將調用 SomeWorkAsync 的類對私有變量 someGlobalVariable 一無所知。 需要獲取值並在里面設置這個變量

public async Task SomeWorkAsync()
{
   someGlobalVariable = await AnotherWorkAsync();
}

如果您需要異步方法的結果,必須await它。

盡量不要混合同步代碼和async await模式,你正在用Result做,你可能會導致死鎖......只是讓async傳播

回答你的問題:

  1. 是的,調用.Result會阻塞你的線程。
  2. 請參閱我對為什么我認為最好使用 await 而不是返回任務的評論: https : //stackoverflow.com/a/54211382/918058

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM