Si verifica una conversione implicita tra Task <> e int?
No. Questa è solo una parte di come async
/ await
funziona.
Qualsiasi metodo dichiarato come async
deve avere un tipo restituito di:
void
(evitare se possibile)
Task
(nessun risultato oltre la notifica di completamento / fallimento)
Task<T>
(per un risultato logico di tipo T
in modo asincrono)
Il compilatore esegue tutti i wrapping appropriati. Il punto è che stai restituendo in modo asincronourlContents.Length
: non puoi fare in modo che il metodo ritorni semplicemente int
, poiché il metodo effettivo tornerà quando raggiunge la prima await
espressione che non è già stata completata. Quindi, invece, restituisce un Task<int>
che verrà completato quando il metodo asincrono stesso sarà completato.
Si noti che await
fa il contrario - si scarta un Task<T>
ad un T
valore, che è come funziona questa linea:
string urlContents = await getStringTask;
... ma ovviamente lo scarta in modo asincrono, mentre il semplice utilizzo Result
si bloccherebbe fino al completamento dell'attività . ( await
può scartare altri tipi che implementano il modello di attesa, ma Task<T>
è quello che probabilmente utilizzerai più spesso.)
Questo doppio avvolgimento / scartamento è ciò che consente a Async di essere così componibile. Ad esempio, potrei scrivere un altro metodo asincrono che chiama il tuo e raddoppia il risultato:
public async Task<int> AccessTheWebAndDoubleAsync()
{
var task = AccessTheWebAsync();
int result = await task;
return result * 2;
}
(O semplicemente return await AccessTheWebAsync() * 2;
ovviamente.)
async
parola chiave.