[英]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
傳播
回答你的問題:
.Result
會阻塞你的線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.