[英]How to return Task.FromResult<bool>(true) using mono cecil?
[英]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:當函數返回Task
或Task<T>
,將對其進行異步處理。 但是它本身不需要async
。
使用async
… await
意味着編譯器將構建狀態機來處理此問題。 但是,如果您僅等待的是最后一個表達式,則可以避免使用此狀態機:
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.