web-dev-qa-db-fra.com

Attend une méthode async vide

Comment puis-je attendre qu'une méthode void async finisse son travail?

par exemple, j'ai une fonction comme ci-dessous:

async void LoadBlahBlah()
{
    await blah();
    ...
}

maintenant, je veux m'assurer que tout a été chargé avant de continuer ailleurs.

130
MBZ

La meilleure pratique consiste à ne marquer la fonction async void que si elle est une méthode de type "taper et oublier". Si vous voulez attendre, vous devez la marquer comme async Task.

Si vous voulez toujours attendre, emballez-le comme suit await Task.Run(() => blah())

187
Rohit Sharma

Si vous pouvez changer la signature de votre fonction en async Task, alors vous pouvez utiliser le code présenté ici

54
user1842575

La meilleure solution consiste à utiliser async Task. Vous devez éviter async void pour plusieurs raisons, dont l'une est la capacité de composition.

Si la méthode ne peut pas doit renvoyer Task (par exemple, il s'agit d'un gestionnaire d'événements), vous pouvez utiliser SemaphoreSlim pour que la méthode soit signalée lorsqu'elle est sur le point de quitter. Envisagez de faire cela dans un bloc finally.

25
Stephen Cleary

faites une AutoResetEvent, appelez la fonction puis attendez AutoResetEvent, puis définissez-la dans un vide asynchrone lorsque vous savez que l'opération est terminée.

Vous pouvez également attendre une tâche qui revient de votre async vide

2
user2712345

Vous n'avez pas vraiment besoin de faire quoi que ce soit manuellement, le mot-clé await suspend l'exécution de la fonction jusqu'au retour de blah().

private async void SomeFunction()
{
     var x = await LoadBlahBlah(); <- Function is not paused
     //rest of the code get's executed even if LoadBlahBlah() is still executing
}

private async Task<T> LoadBlahBlah()
{
     await DoStuff();  <- function is paused
     await DoMoreStuff();
}

T est le type d'objet blah() renvoie

Vous ne pouvez pas vraiment await une fonction void alors LoadBlahBlah() ne peut pas être void

1
Mayank