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.
fonte
2015-05-27 21:16:41
L'intento non è più chiaro? – svick
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. –
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