¿Alguien puede explicar qué significa esto en un método sincrónico? Si trato de cambiar el método a async
VS, entonces me quejo.
Esto funciona:
public Task MethodName()
{
return Task.FromResult<object>(null);
}
Esto no funciona:
public async Task MethodName()
{
return Task.FromResult<object>(null);
}
Básicamente, me gustaría saber qué significa exactamente esto: Task.FromResult<object>(null);
c#
asynchronous
async-await
David Dury
fuente
fuente
return;
trabajo también ...!void
función.Respuestas:
async
Los métodos son diferentes a los métodos normales. Lo que devuelva de losasync
métodos está envuelto en unTask
.Si no devuelve ningún valor (nulo), se envolverá
Task
, si devuelveint
, se envolveráTask<int>
y así sucesivamente.Si su método asíncrono necesita retornar
int
, marcaría el tipo de retorno del método comoTask<int>
y devolverá sin formatoint
elTask<int>
. Compilador convertirá elint
queTask<int>
para usted.Del mismo modo, cuando devuelva
Task<object>
el tipo de retorno de su método debe serTask<Task<object>>
Como su método está regresando
Task
, no debería devolver ningún valor. De lo contrario, no se compilará.Tenga en cuenta que el método asíncrono sin una
await
declaración no lo esasync
.fuente
DoStuff()
. Por ejemplo:var x = await DoStuff();
return await Task.FromResult<object>(null);
Task.WhenAny
es un ejemplo.Debe usar la palabra clave await cuando use async y el tipo de retorno de su función debe ser genérico. Aquí hay un ejemplo con valor de retorno:
Aquí hay un ejemplo sin valor de retorno:
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 .tareas (v = vs.110) .aspx
Asíncrono: http://msdn.microsoft.com/en-us/library/hh156513.aspx Aguarde: http://msdn.microsoft.com/en-us/library/hh156528.aspx
fuente
null
directamente en lugar de esperar una tarea ficticia.async
método se ejecutará de forma asincrónica con una sugerencia de usar laawait
palabra clave en algún lugar del método. Sugiero usarreturn Task.FromResult((object)null);
y eliminar laasync
palabra clave para reducir el ruido de advertencia del compilador.return
en una tarea, pero la tarea sigue ejecutándose, porquereturn
no está devolviendo unTask
Agregar la palabra clave asíncrona es simplemente azúcar sintáctica para simplificar la creación de una máquina de estados. En esencia, el compilador toma su código;
Y lo convierte en;
Si su código tiene alguna
await
palabra clave, el compilador debe tomar su método y convertirlo en una clase para representar la máquina de estado requerida para ejecutarlo. En cadaawait
palabra clave, el estado de las variables y la pila se conservarán en los campos de la clase, la clase se agregará como un enlace de finalización a la tarea que está esperando y luego regresará.Cuando esa tarea se complete, 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 async & await? por un sangriento ejemplo.
Este proceso tiene mucho en común con la forma en que el compilador maneja los métodos iteradores con declaraciones de rendimiento.
fuente
Esta es una tarea que devuelve una tarea de tipo String (función anónima de C # o, en otras palabras, una delegación se usa 'Func')
fuente
Para obtener respuestas adecuadas de los métodos asincrónicos, debe esperar mientras llama a esos métodos de tarea. Eso esperará a volver a convertirlo al tipo de valor devuelto en lugar del tipo de tarea.
fuente