Considérez tiliser async sans attendre .
pensez que vous comprenez peut-être mal ce que fait l'async. L'avertissement est tout à fait exact: si vous marquez votre méthode comme asynchrone mais n'utilisez l'attente nulle part, votre méthode ne sera pas asynchrone. Si vous l'appelez, tout le code à l'intérieur de la méthode s'exécutera de manière synchrone.
Je veux écrire une méthode qui devrait exécuter asynchrone mais qui n'a pas besoin d'être utilisée.
public async Task PushCallAsync(CallNotificationInfo callNotificationInfo)
{
Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId,
}
Je veux appeler PushCallAsync
et exécuter asynchrone et je ne veux pas utiliser attendre.
Puis-je utiliser async sans attendre en C #?
Si votre Logger.LogInfo
est déjà asynchrone cela suffit:
public void PushCallAsync(CallNotificationInfo callNotificationInfo)
{
Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId,
}
Si ce n'est pas simplement le démarrer asynchrone sans l'attendre
public void PushCallAsync(CallNotificationInfo callNotificationInfo)
{
Task.Run(() => Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId));
}
Vous vous méprenez toujours async
. Le mot clé async
ne signifie pas "exécuter sur un autre thread".
Pour pousser du code sur un autre thread, vous devez le faire explicitement, par exemple, Task.Run
:
await Task.Run(() => Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId));
J'ai un async
/await
intro post qui peut vous être utile.
Vous vous méprenez async
. En fait, il dit simplement au compilateur de propager l'inversion du flux de contrôle qu'il fait en arrière-plan pour vous. Pour que toute la pile de méthodes soit marquée comme asynchrone.
Ce que vous voulez réellement faire dépend de votre problème. (Considérons que votre appel Logger.LogInfo(..)
est une méthode async
car il appelle finalement File.WriteAsync () ou ainsi.
Logger.LogInfo(..)
est terminé, vous devez prendre des précautions. C'est le cas lorsque votre méthode est en quelque sorte au milieu de la pile des appels. Ensuite, Logger.LogInfo(..)
retournera généralement un Task
et que vous pouvez attendre. Mais méfiez-vous d'appeler task.Wait () car cela verrouillera votre thread GUI. Utilisez plutôt attendre ou renvoyer la tâche (vous pouvez alors omettre async):public void PushCallAsync(CallNotificationInfo callNotificationInfo)
{
return Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId);
}
ou
public async void PushCallAsync(CallNotificationInfo callNotificationInfo)
{
await Logger.LogInfo("Pushing new call {0} with {1} id".Fill(callNotificationInfo.CallerId);
}
Si Logger.LogInfo est une méthode synchrone, tout l'appel sera de toute façon synchrone. Si tout ce que vous voulez faire est d'exécuter le code dans un thread séparé, async n'est pas l'outil pour le travail. Essayez plutôt avec le pool de threads:
ThreadPool.QueueUserWorkItem( foo => PushCallAsync(callNotificationInfo) );