簡體   English   中英

為什么要返回等待Task.FromResult(true); 而不是僅僅返回true?

[英]Why return await Task.FromResult(true); instead of just return true?

當您使用VS2017創建Xamarin Forms Master-Detail示例時,您將獲得一個MockDataStore類,該類使用以下方法生成:

    public async Task<bool> DeleteItemAsync(string id)
    {
        var _item = items.Where((Item arg) => arg.Id == id).FirstOrDefault();
        items.Remove(_item);

        return await Task.FromResult(true);
    }

這是Microsoft的例子真是天真, 因此必須正確

我不明白為什么這些方法不只是return true ,還沒有看到這個成語的解釋。 我在這里缺少什么細微之處,還是應該從模板中清除掉的歷史性解決方法?

我想這背后的原因是為了防止“異步方法缺少等待操作符”編譯器警告。 此自動生成的代碼的作者希望將功能標記為async ,因為這是實現實際功能時無論如何都會做的。 因此,為防止編譯器警告(任何自動生成的代碼都不會生成編譯器警告),您需要等待,而他們的代碼中沒有等待的內容,因此他們選擇等待Task.FromResult

當然,當您自己編寫代碼而不為將來的編輯自動生成代碼時,您不需要這樣做。

此方法也可以(應該)同步實現,因為它確實確實是同步的:

public bool DeleteItem(string id)
{
    var _item = items.Where((Item arg) => arg.Id == id).FirstOrDefault();
    items.Remove(_item);

    return true;
}

將同步方法命名為* Async並返回Task<T>毫無意義。

我猜您應該在其中添加自己的異步刪除邏輯。 畢竟,生成的代碼只是示例代碼。

然后,您將等待實際的數據庫操作,而不是Task.FromResult (true),即用對執行數據庫查詢的方法的異步調用替換Task.FromResult(true) ,然后在異步方法成功返回后返回true

TL; DR:當函數返回TaskTask<T> ,將對其進行異步處理。 但是它本身不需要async

使用asyncawait意味着編譯器將構建狀態機來處理此問題。 但是,如果您僅等待的是最后一個表達式,則可以避免使用此狀態機:

public Task<bool> DeleteItemAsync(string id)
{
    // Nothing awaitable here...

    return Task.FromResult(true);
}

並創建一個可同步運行的函數-但具有異步函數的簽名和行為,因為該函數對異步行為進行了調用。

為什么要返回Task<T> :因為這就是呼叫者所期望的:如果不更改所有呼叫者,他們的呼叫者以及他們的呼叫者,…一直下去(可能),就無法更改此值。

因此,簽名不能更改。 您必須退貨等待。 但是,如果那是您要做的最后一件事,則可以只返回另一個結果的“等待時間”(有點像實現尾遞歸)。

你會得到一個MockDataStore

因此,這僅用於測試:開銷不太可能是很大的,它提供的代碼可以作為真實代碼的外觀的一個很好的示例。 (比起腳手架的代碼好得多,非常糟糕),這提供了一個不好的例子。)

注意:對於C#7,這是使用ValueTask<T>一個好例子,以避免當立即知道結果時分配Task<T>的開銷。

暫無
暫無

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

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