2016-07-11 65 views
5

Quando costruisco un'istanza di una classe che ho, vorrei attivare una funzione di rinnovo token (metodo async) e lasciarla girare in background (tengo un riferimento allo Task restituito).Cosa succede quando si è in attesa di un'attività già completata?

In seguito, quando un utente attiva una richiesta, mi piacerebbe attendere su tale Task.

Supponiamo che il Task si completi dopo 1 secondo e che l'utente inneschi una richiesta dopo 2 secondi (il che significa che il Task è completato).

Il metodo che gestisce la richiesta dell'utente await s che Task, otterrà il valore immediatamente? dopotutto, lo Task è completato e contiene il valore.

+3

Sì, restituirebbe immediatamente il risultato. –

+0

@MatthewWatson perché non l'hai scritto come risposta? Avrei accettato la tua risposta – johni

+0

Non è stato abbastanza lungo o abbastanza dettagliato per scrivere come risposta, ho pensato. –

risposta

6

Il metodo che gestisce la richiesta dell'utente attende quell'attività, otterrà il valore immediatamente?

Sì. Si può pensare che sia pigro, se si è await un'attività che è già completata, restituisce immediatamente. Potresti attenderlo più volte su thread diversi e verrebbe restituito solo una volta che ha ottenuto il risultato (o è in errore).

Task.CompletedTask è stato aggiunto per gentilezza per questo motivo. Si potrebbe await questo e sarebbe immediatamente restituire un compito di successo in quanto è già stato completato.

0

Avrete immediat il risultato. Una volta completata l'attività, la proprietà del risultato conterrà il risultato e lo manterrà.

1

È possibile creare un'attività completata utilizzando Task.FromResult (valore) e attendere che:

var result = await Task.FromResult(5); 
Debug.Assert(result == 5); 

Questo è utile per esempio se si dispone di un metodo che può restituire cache dati, ma ha bisogno di prenderlo in modo asincrono il prima volta.

Quindi, sì, è possibile attendere le attività già completate.