¿Se produce una conversión implícita entre Task <> e int?
¡No! Esto es solo una parte de cómo funciona async/ await.
Cualquier método declarado como asyncdebe tener un tipo de retorno de:
void (evitar si es posible)
Task (ningún resultado más allá de la notificación de finalización / falla)
Task<T>(para un resultado lógico de tipo Tde forma asincrónica)
El compilador hace todo el ajuste apropiado. El punto es que está regresando de forma asincrónicaurlContents.Length ; no puede hacer que el método simplemente regrese int, ya que el método real regresará cuando llegue a la primera awaitexpresión que aún no se ha completado. Entonces, en cambio, devuelve un Task<int>que se completará cuando se complete el método asincrónico.
Tenga en cuenta que awaithace lo contrario: desenvuelve un Task<T>a un Tvalor, que es como funciona esta línea:
string urlContents = await getStringTask;
... pero, por supuesto, lo desenvuelve de forma asincrónica, mientras que con solo usarlo Resultse bloquearía hasta que se complete la tarea. ( awaitpuede desenvolver otros tipos que implementan el patrón de espera, pero Task<T>es el que probablemente usará con más frecuencia).
Este doble envoltorio / desenvolvimiento es lo que permite que async sea tan componible. Por ejemplo, podría escribir otro método asíncrono que llame al suyo y duplique el resultado:
public async Task<int> AccessTheWebAndDoubleAsync()
{
var task = AccessTheWebAsync();
int result = await task;
return result * 2;
}
(O simplemente return await AccessTheWebAsync() * 2;por supuesto).
asyncpalabra clave.