understanding run method await async c# asynchronous async-await

await - run method async c#



async espera a regresar Tarea (3)

¿Puede alguien explicar qué significa esto para un método sincrónico? Si trato de cambiar el método para async entonces VS se queja de ello.

Esto funciona:

public Task MethodName() { return Task.FromResult<object>(null); }

Esto no funciona:

public async Task MethodName() { return Task.FromResult<object>(null); }

Así que, básicamente, me gustaría saber qué significa exactamente esto: Task.FromResult<object>(null);


Agregar la palabra clave async es solo azúcar sintáctico para simplificar la creación de una máquina de estado. En esencia, el compilador toma su código;

public async Task MethodName() { return null; }

Y lo convierte en;

public Task MethodName() { return Task.FromResult<object>(null); }

Si su código tiene palabras clave en await , el compilador debe tomar su método y convertirlo en una clase para representar la máquina de estado requerida para ejecutarlo. En cada palabra clave await , el estado de las variables y la pila se conservarán en los campos de la clase, la clase se agregará como un gancho de finalización a la tarea que está esperando y luego regresará.

Cuando se complete esa tarea, su tarea se ejecutará nuevamente. Por lo tanto, se agrega un código adicional en la parte superior del método para restaurar el estado de las variables y saltar a la siguiente losa de su código.

Consulte ¿Qué genera asincronizar y esperar generar? para un sangriento ejemplo.

Este proceso tiene mucho en común con la forma en que el compilador maneja los métodos de iteración con las declaraciones de rendimiento.


Debe usar la palabra clave await cuando use async y su tipo de devolución de función debe ser genérico. Aquí hay un ejemplo con valor de retorno:

public async Task<object> MethodName() { return await Task.FromResult<object>(null); }

Aquí hay un ejemplo sin valor de retorno:

public async Task MethodName() { await Task.CompletedTask; }

Lee esto:

TPL: http://msdn.microsoft.com/en-us/library/dd460717(v=vs.110).aspx y tareas: http://msdn.microsoft.com/en-us/library/system.threading.tasks(v=vs.110).aspx

Async: http://msdn.microsoft.com/en-us/library/hh156513.aspx Espere: http://msdn.microsoft.com/en-us/library/hh156528.aspx


async métodos async son diferentes a los métodos normales. Cualquier cosa que devuelva de los métodos async se envuelve en una Task .

Si no devuelve ningún valor (nulo) se incluirá en Task . Si devuelve int se cerrará en Task<int> y así sucesivamente.

Si su método async necesita regresar int , marcará el tipo de retorno del método como Task<int> y devolverá plain int not the Task<int> . El compilador convertirá int en la Task<int> por usted.

private async Task<int> MethodName() { await SomethingAsync(); return 42;//Note we return int not Task<int> and that compiles }

Sameway, cuando devuelve Task<object> el tipo de devolución de su método debe ser Task<Task<object>>

public async Task<Task<object>> MethodName() { return Task.FromResult<object>(null);//This will compile }

Como su método devuelve Task , no debe devolver ningún valor. De lo contrario, no se compilará.

public async Task MethodName() { return;//This should work but return is redundant and also method is useless. }

Tenga en cuenta que el método asincrónico sin una declaración de await no es async .