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.
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())
Si vous pouvez changer la signature de votre fonction en async Task
, alors vous pouvez utiliser le code présenté ici
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
.
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
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