¿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 async
debe 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 T
de 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 await
expresió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 await
hace lo contrario: desenvuelve un Task<T>
a un T
valor, 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 Result
se bloquearía hasta que se complete la tarea. ( await
puede 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).
async
palabra clave.