2014-05-09 12 views
10

Załóżmy Mam metodę, która nie jest asynchroniczny ale zwraca Task (ponieważ definicja jest z interfejsu przeznaczonego również dla asynchronicznych implementacjach)Co zwrócić z metody asynchronicznej z zadaniem jako typem zwracanym?

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

    return ...; 
} 

Jaki jest najlepszy obiekt do powrotu? Moje obecne opcje:

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

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

uwaga Side - jeśli jego możliwości, a następnie wprowadzić oddzielny interfejs, który nie ma operacji async (zasada ISP) –

+2

@SergeyBerezovskiy - największym problemem w tym przypadku jest to, że osoby dzwoniącej musi przełączać się między dwoma interfejsami w zależności od dostarczonej implementacji (na przykład przez IoC). Mógłbym stworzyć opakowanie pomiędzy, ale pierwotne pytanie jest nadal ważne. –

Odpowiedz

16

Nie można powrócić Task.Yield(), to nie jest Task ale YieldAwaitable do użytku z await i rzeczywiście wprowadza asynchrony (Zamieściłem kilka more details here).

Do tego celu używam Task.FromResult(Type.Missing). Być może najbardziej wydajną, choć nieudokumentowaną opcją jest Task.Delay(0), it returns a static completed task.

+1

Poszedłem z pierwszym, dla czytelności. –

+0

@YuvalItzchakov, ja też. Zwraca także unikalne zadania, w przeciwieństwie do 'Task.Delay (0)'. Możemy to buforować, jeśli chcemy. – Noseratio

+5

+1. Lubię 'Task.FromResult (null)', ale zespół .NET raczej preferuje 'Task.FromResult (0)'. Jednak żaden z nich nie jest buforowany. –

Powiązane problemy