2017-08-14 192 views
-1

我有一個異步方法返回任務。我需要在以下情況下返回任何內容嗎?從異步方法返回

public async Task UpdateProductSpecificationsAsync() 
    { 
     await _productRepository.UpdateProductSpecificationsAsync(); //Takes long time to execute 
    } 

以下代碼示例是否相互等價?

public Task UpdateProductSpecifications() 
    { 
     _productRepository.UpdateProductSpecifications(); //Takes long time to execute 
     return Task.FromResult(0); 
    } 

    public Task UpdateProductSpecifications() 
    { 
     _productRepository.UpdateProductSpecifications(); //Takes long time to execute 
     return Task.CompletedTask; 
    } 

有什麼情況我應該等待Task.TaskCompleted

+3

那麼它不是實現任何異步明智的,不妨是同步 – MickyD

+0

如果UpdateProductSpecifications函數花費很長時間執行並需要同時運行不同的產品?在UpdateProductSpecifications函數執行時釋放主叫端資源也是有益的。 –

+0

您如何知道在第二個示例中完成更新的時間? –

回答

3

我有一個異步方法返回的任務。我需要在以下情況下返回任何內容嗎?

async Task方法相當於非異步void方法。並且像非異步void方法,async Task方法不能返回任何東西。

這就是說,你的例子看起來很奇怪。如果您要在該方法中執行的操作正在等待其他一些異步方法,則根本不應該打擾async/await。只返回Task直接:

public Task UpdateProductSpecificationsAsync() 
{ 
    return _productRepository.UpdateProductSpecificationsAsync(); 
} 

是下面的代碼示例相當於對方?

定義「等價」。對我來說,他們肯定是而不是等效。第一個創建一個新的Task<int>對象,並將該對象返回爲Task。調用代碼將不得不將其轉換回Task<int>以查看結果值。

第二返回靜態Task.CompletedTask屬性值,它是一個單獨的對象,每個進程僅分配一次。呼叫者無法讀取結果值。

主叫方將不得不去加班直接觀察這些差異,但最起碼​​,返回參照singleton對象是不是每次創建新對象更高效。當然,這是否意義重大取決於你打電話給該方法的頻率。

所有這一切說,我不明白爲什麼要在這個情況下,你不會實現它是這樣的(假設有在_productRepository方法沒有真正的異步版本):

public Task UpdateProductSpecificationsAsync() 
{ 
    return Task.Run(() => _productRepository.UpdateProductSpecifications()); 
} 

,那麼你會得到實際的異步行爲,這是調用者通常期望的。儘管方法看起來就像它是異步的,但您的版本強制呼叫方等待。恕我直言,這是一個非常糟糕的主意,編寫謊言的代碼。

有什麼情況我應該等待Task.TaskCompleted [原文如此]?

您是指直接?或者通過不知道它已交給Task.CompletedTask參考的代碼?我將假設前者,因爲期望後者有任何想法就是它的做法是不合理的。

這似乎是對我來說過於寬泛的問題。 任何的情況?這是開放的解釋。

這就是說,我會對這個問題說「不」。等待什麼知道已經完成? await不會退回給調用者,因爲等待已完成。這對我來說似乎是一種浪費。

我可以想象其中一個等待Task.CompletedTask的情景,以達到其他所需的副作用。我已經看到了比生產代碼更奇特的東西。但我不會推薦它。無論我們在談論什麼假設的副作用,我都確定這不是一個記錄在案的副作用,所以人們會依賴未經證實的實施細節,這些細節可能會在未來發生變化。

不要寫脆弱的代碼。編寫僅依賴記錄的行爲的代碼,只做明顯意義的事情。 (並且推論:如果你違反了這個規則,至少寫一個非常詳細的評論,解釋你爲什麼寫了怪異的,脆弱的代碼。)