¿Alguien puede explicar qué significa esto en un método sincrónico? Si trato de cambiar el método a asyncVS, 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 ...!voidfunción.Respuestas:
asyncLos métodos son diferentes a los métodos normales. Lo que devuelva de losasyncmé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 formatointelTask<int>. Compilador convertirá elintqueTask<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
awaitdeclaración no lo esasync.fuente
DoStuff(). Por ejemplo:var x = await DoStuff();return await Task.FromResult<object>(null);Task.WhenAnyes 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
nulldirectamente en lugar de esperar una tarea ficticia.asyncmétodo se ejecutará de forma asincrónica con una sugerencia de usar laawaitpalabra clave en algún lugar del método. Sugiero usarreturn Task.FromResult((object)null);y eliminar laasyncpalabra clave para reducir el ruido de advertencia del compilador.returnen una tarea, pero la tarea sigue ejecutándose, porquereturnno está devolviendo unTaskAgregar 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
awaitpalabra clave, el compilador debe tomar su método y convertirlo en una clase para representar la máquina de estado requerida para ejecutarlo. En cadaawaitpalabra 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