method - Usando async sin esperar en c#?
task run in c# (4)
Estás malentendido async
. En realidad, simplemente le dice al compilador que propague la inversión del flujo de control que realiza en segundo plano para usted. Para que toda la pila de métodos se marque como asíncrono.
Lo que realmente quieres hacer depende de tu problema. (Consideremos que su llamada Logger.LogInfo(..)
es un método async
, ya que eventualmente llama a File.WriteAsync () o así.
- Si la función de llamada es un controlador de eventos nulos, está bien. La llamada asíncrona se producirá en cierta medida (a saber, File.WriteAsync) en segundo plano. No esperas ningún resultado en tu flujo de control. Eso es fuego y olvido.
- Sin embargo, si desea hacer algo con el resultado o si desea continuar solo en ese momento, cuando
Logger.LogInfo(..)
está listo, debe tomar precauciones. Este es el caso cuando su método está de alguna manera en medio de la pila de llamadas. Luego,Logger.LogInfo(..)
generalmente devolverá unaTask
y puede esperar. Pero ten cuidado con llamar a task.Wait () porque bloqueará tu GUI-Thread. En su lugar, use await o return the Task (entonces puede omitir async):
public void PushCallAsync(CallNotificationInfo callNotificationInfo)
{
return Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId);
}
o
public async void PushCallAsync(CallNotificationInfo callNotificationInfo)
{
await Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId);
}
Considere el uso de async sin esperar .
piensa que tal vez mal entiendes lo que hace async. La advertencia es exactamente correcta: si marca su método como asíncrono pero no utiliza esperar en ningún lugar, entonces su método no será asíncrono. Si lo llama, todo el código dentro del método se ejecutará de forma síncrona.
Quiero escribir un método que debería ejecutarse de forma asíncrona pero no necesito usar await.por ejemplo, cuando se usa un hilo
public async Task PushCallAsync(CallNotificationInfo callNotificationInfo)
{
Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId,
}
Quiero llamar a PushCallAsync
y ejecutar async y no quiero usar esperar.
¿Puedo usar async sin esperar en C #?
Si Logger.LogInfo es un método síncrono, toda la llamada será sincrónica de todos modos. Si todo lo que desea hacer es ejecutar el código en un hilo separado, async no es la herramienta para el trabajo. Pruebe con el grupo de subprocesos en su lugar:
ThreadPool.QueueUserWorkItem( foo => PushCallAsync(callNotificationInfo) );
Si su Logger.LogInfo
ya está asíncrono, esto es suficiente:
public void PushCallAsync(CallNotificationInfo callNotificationInfo)
{
Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId,
}
Si no es solo arrancarlo async sin esperar.
public void PushCallAsync(CallNotificationInfo callNotificationInfo)
{
Task.Run(() => Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId));
}
Todavía estás malentendido async
. La palabra clave async
no significa "ejecutar en otro hilo".
Para insertar algo de código en otro hilo, debe hacerlo explícitamente, por ejemplo, Task.Run
:
await Task.Run(() => Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId));
Tengo una publicación de introducción async
/ await
que puede ser útil.