2014-05-09 60 views
10

假設我有一個不是異步方法,但返回一個Task(因爲定義是也用於異步實現的接口)從Task的非異步方法返回什麼作爲返回類型?

public Task DoWorkAsync(Guid id) 
{ 
    // do the work 

    return ...; 
} 

什麼是回報最好的對象?我現在的選擇:

return Task.Yield(); 
return Task.FromResult<object>(null); 

// any of the other but cached in a static field and reused. 
+0

附註 - 如果可能的話,再引入獨立的接口,它不具有異步操作(ISP原則) –

+2

@SergeyBerezovskiy - 在這種情況下,最大的問題是,來電者必須根據所提供的實現(例如IoC)在兩個接口之間切換。我可以在中間創建一個包裝,但對於它來說,原始問題仍然很重要。 –

回答

16

您不能返回Task.Yield(),它不是一個TaskYieldAwaitable爲使用await,它實際上引入了異步(我張貼一些more details here)。爲此,我使用Task.FromResult(Type.Missing)。也許,最有效的,雖然沒有記錄的選項是Task.Delay(0),it returns a static completed task

+1

爲了可讀性,我會和前者一起去。 –

+0

@YuvalItzchakov,我也是。它也返回一個獨特的任務,與'Task.Delay(0)'不同。如果我們願意,我們可以緩存它。 – Noseratio

+5

+1。我喜歡'Task.FromResult (null)',但.NET團隊傾向於選擇'Task.FromResult(0)'。但是,這些都不會被緩存。 –