簡體   English   中英

等待 Task.CompletedTask 是為了什么?

[英]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.

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