Las respuestas de SLaks y Killercam son buenas; Pensé que solo agregaría un poco más de contexto.
Su primera pregunta es esencialmente sobre qué métodos se pueden marcar async
.
Un método marcado como async
puede volver void
, Task
o Task<T>
. Cuáles son las diferencias entre ellos?
Se Task<T>
puede esperar un método asíncrono de retorno, y cuando la tarea se complete, ofrecerá una T.
Se Task
puede esperar un método asíncrono de retorno, y cuando la tarea se completa, la continuación de la tarea está programada para ejecutarse.
UNA void
método asíncrono de volver no puede ser esperada; Es un método de "dispara y olvida". Funciona de forma asíncrona, y no tienes forma de saber cuándo se hace. Esto es más que un poco extraño; como dice SLaks, normalmente solo lo haría al hacer un controlador de eventos asíncrono. El evento se dispara, el controlador se ejecuta; nadie va a "esperar" la tarea devuelta por el controlador de eventos porque los controladores de eventos no devuelven tareas, e incluso si lo hicieran, ¿qué código usaría la tarea para algo? En general, no es el código de usuario el que transfiere el control al controlador en primer lugar.
Su segunda pregunta, en un comentario, es esencialmente sobre lo que se puede await
editar:
¿Qué tipo de métodos se pueden await
editar? ¿Se puede editar un método de retorno de vacío await
?
No, no se puede esperar un método de retorno nulo. El compilador se traduce await M()
en una llamada a M().GetAwaiter()
, donde GetAwaiter
podría ser un método de instancia o un método de extensión. El valor esperado debe ser uno para el que pueda obtener un camarero; claramente, un método de retorno de vacío no produce un valor del cual se pueda obtener un camarero.
Task
-los métodos de retorno pueden producir valores esperados. Anticipamos que terceros querrán crear sus propias implementaciones de Task
objetos similares que se pueden esperar, y usted podrá esperarlos. Sin embargo, no se le permitirá declarar async
métodos que devuelvan cualquier cosa que no sea void
, Task
o Task<T>
.
(ACTUALIZACIÓN: Mi última oración allí puede ser falsificada por una versión futura de C #; hay una propuesta para permitir tipos de retorno que no sean tipos de tareas para métodos asíncronos).
(ACTUALIZACIÓN: La función mencionada anteriormente llegó a C # 7.)