2012-11-29 4 views
80

Comment puis-je attendre une méthode void async pour terminer son travail?Attendre une méthode async void

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

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

maintenant je veux vous assurer que tout a été chargé avant de poursuivre ailleurs.

Répondre

97

meilleure pratique consiste à marquer la fonction async void que si elle est le feu et oublier méthode, si vous voulez attendre, vous devriez le marquer comme async Task.

Dans le cas si vous voulez continuer à attendre, puis l'envelopper comme si await Task.Run(() => blah())

51

Si vous pouvez changer la signature de votre fonction à async Task vous pouvez utiliser le code présenté here

2

Vous n'avez pas vraiment besoin de faire quoi que ce soit manuellement, await mot-clé met en pause l'exécution de la fonction jusqu'à ce que blah() retours.

private async void SomeFunction() 
{ 
    var x = await LoadBlahBlah(); <- Function is paused 
    //do more stuff when LoadBlahBlah() returns 
} 

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

T est le type d'objet blah() retours

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

+0

Je veux attendre 'LoadBlahBlah()' à la fin, pas 'bla()' – MBZ

+0

réponse – Mayank

+5

de @MBZ mis à jour Malheureusement async méthodes vides font ne suspend pas l'exécution (contrairement aux méthodes de tâche asynchrone) – ghord

17

La meilleure solution est d'utiliser async Task. Vous devriez éviter async void pour plusieurs raisons, dont l'une est la composabilité.

Si la méthode ne peut être fait pour revenir Task (par exemple, il est un gestionnaire d'événements), vous pouvez utiliser SemaphoreSlim pour avoir le signal de méthode quand il est sur le point de sortir. Envisagez de le faire dans un bloc finally.

2

effectuez un événement AutoResetEvent, appelez la fonction, puis patientez sur AutoResetEvent, puis définissez-le dans async void lorsque vous savez que c'est fait.

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

Questions connexes