[英]await Task.CompletedTask for what?
我使用 Build2017 中引入的Windows Template Studio創建了 UWP 應用程序。
下面的類是從它生成的代碼的一部分。
public class SampleModelService
{
public async Task<IEnumerable<SampleModel>> GetDataAsync()
{
await Task.CompletedTask; // <-- what is this for?
var data = new List<SampleModel>();
data.Add(new SampleModel
{
Title = "Lorem ipsum dolor sit 1",
Description = "Lorem ipsum dolor sit amet",
Symbol = Symbol.Globe
});
data.Add(new SampleModel
{
Title = "Lorem ipsum dolor sit 2",
Description = "Lorem ipsum dolor sit amet",
Symbol = Symbol.MusicInfo
});
return data;
}
}
我的問題是, await Task.CompletedTask;
的目的和原因是await Task.CompletedTask;
代碼在這里? 它實際上沒有從中獲取Task
結果接收器。
它可以讓后期更容易實現異步代碼調用,而無需更改簽名,從而避免重構調用代碼。
雖然腳手架示例代碼是同步的,但 Template Studio 是專門圍繞異步數據訪問層設計的,您需要通過修改生成的方法的主體來實現自己的數據訪問。
如果沒有實現異步實現,整個模板化應用程序中的代碼將發生重大變化,對於新開發人員來說,這將是一個非常陡峭的學習曲線,模板的重點是以最少的努力甚至經驗來啟動和運行!
另一種選擇是從方法簽名和該行中刪除async
關鍵字並執行
return Task.FromResult<IEnumerable<SampleModel>>(data);
例如,當您由於接口而需要返回可等待任務時,您會看到此構造,而實現沒有異步工作要做。
然而,在這種情況下,由於它是一個模板,他們希望人們用await FetchDataFromDatabaseAsync();
類的東西替換await Task.Completed
await FetchDataFromDatabaseAsync();
. 由於async
關鍵字已經存在,它最大限度地減少了實現您自己的異步調用所需的更改。
無論如何,如果沒有這個 await 構造,你可以這樣做:
public class SampleModelService
{
public Task<IEnumerable<SampleModel>> GetDataAsync()
{
var data = new List<SampleModel>();
data.Add(new SampleModel
{
Title = "Lorem ipsum dolor sit 1",
Description = "Lorem ipsum dolor sit amet",
Symbol = Symbol.Globe
});
data.Add(new SampleModel
{
Title = "Lorem ipsum dolor sit 2",
Description = "Lorem ipsum dolor sit amet",
Symbol = Symbol.MusicInfo
});
return Task.FromResult<IEnumerable<SampleModel>>(data);
}
}
如果根本不需要返回任務(您沒有任何異步代碼),則只需將其完全刪除即可。 (但是你必須重構調用這個方法的代碼)
查看此代碼,我懷疑有人會在開發過程的后期調用異步方法,並且已經通過指定此方法返回Task
來預期這一點。
await Task.CompletedTask使得實現這個方法變得更容易,正如第一個答案所說,由於這個實現並不耗時,因此“await Task.CompletedTask;” 或“返回 Task.FromResult(data);” 兩者將同步運行。 你可以使用上面提到的這兩種模式,但是這個方法被設計為異步方法,所以當你的實現很耗時但沒有任何異步代碼時,使用Task.Run來創建一個任務。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.