2013-05-13 4 views
5

Ho un'interfaccia IAnimation che espone un metodo BeginAsync(). Quel metodo dovrebbe avviare l'animazione e tornare quando è completato.Metodo asincrono che non fa nulla

Quello che mi piacerebbe fare è implementare una classe di animazione NoAnimation che restituisce solo quando viene eseguita BeginAsync().

È la giusta implementazione?

public async Task BeginAsync() 
{ 
    await Task.Run(() => { }); 
} 

Sospetto che ci sia un approccio più elegante di questo. Ho anche considerato creando un metodo vuoto. Ma questo mi dà un avvertimento che non mi piace neanche.

+0

Correlato: [Crea un'attività completata] (http://stackoverflow.com/q/14244114/1497596) – DavidRR

+1

Possibile duplicato di [Se la mia interfaccia deve restituire Attività qual è il modo migliore per ottenere un'implementazione senza operazioni? ] (http://stackoverflow.com/questions/13127177/if-my-interface-must-return-task-what-is-the-best-way-to-have-a-no-operation-imp) –

risposta

12

Basta usare Task.CompletedTask per restituire un compito completato:

public Task BeginAsync() 
{ 
    return Task.CompletedTask; 
} 

Se si dispone di un Task<TResult> uso Task.FromResult<TResult> per restituire un compito completato con un risultato:

public Task<bool> BeginAsync() 
{ 
    return Task.FromResult(true); 
} 

Il tuo attuale implementazione è molto inefficiente, come costruisce la macchina a stati, e usa anche un thread ThreadPool per eseguire l'attività vuota.