web-dev-qa-db-fra.com

Utiliser async sans attendre en C #?

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 #?

27
user1968030

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));
}
28
Visions

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.

24
Stephen Cleary

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.

  • Si vous appelez la fonction est un gestionnaire d'événements vide, vous êtes bon. L'appel asynchrone se produira dans une certaine mesure (à savoir File.WriteAsync) en arrière-plan. Vous n'attendez aucun résultat dans votre flux de contrôle. C'est du feu et oubliez.
  • Si toutefois vous voulez faire quelque chose avec le résultat ou si vous voulez continuer seulement alors, lorsque 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); 
 }
6
Robetto

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) );
2
ya23