2015-05-27 13 views
18

This blog post menziona le nuove API di attività, inclusa una nuova proprietà Task.CompletedTask introdotta in .NET 4.6.Qual è il punto di Task.CompletedTask di .NET 4.6?

Perché è stato aggiunto? Com'è meglio di, diciamo, Task.FromResult(whatever)?

+3

L'intento non è più chiaro? – svick

+0

Il motivo è che è possibile risparmiare memoria creando attività immutabili statiche che si trovano in stati fissi. Se devi restituire un'attività completata perché, ad es. è possibile scaricare solo materiale dalla rete e in caso contrario restituire un compito fittizio che è impostato su completato in modo che il chiamante che attende il proprio compito possa continuare immediatamente. Fino ad ora era necessario creare la propria istanza e memorizzarla nella cache o crearla ogni volta tramite TaskCompletionSource. –

+0

Il post del blog spiega già perché 'Task.CompletedTask' è stato aggiunto ... Indica in modo specifico" codice di libreria che si occupa delle prestazioni ed evita allocazioni ". Ora confrontalo con il tuo 'Task.FromResult (qualunque cosa)': evita le allocazioni? No, non è così. – hvd

risposta

24

Task.FromResult(whatever) funziona per Task<TResult>, ma fino alla versione 4.6 non c'era nulla per l'attività non generica. È possibile utilizzare FromResult con un valore fittizio e inoltrarlo implicitamente a Task, ma ciò offusca in qualche modo l'intenzione (non si restituisce effettivamente alcun valore asincrono ) e alloca gli oggetti sottostanti (mentre CompletedTask può essere memorizzato nella cache e condiviso tra tutti i chiamanti) .

Non è raro vedere le attività personalizzate statiche completate nelle codebase correnti (4.5.2 e precedenti), quindi a mio parere ha senso incorporarlo al framework stesso.