2012-11-29 13 views
80

Come è possibile attendere il completamento di un metodo void async?Attendere un metodo asincrono di annullamento

per esempio, ho una funzione come di seguito:

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

ora voglio fare in modo che tutto ciò che è stato caricato prima di continuare da qualche altra parte.

risposta

97

Best Practice è per contrassegnare la funzione async void solo se è il fuoco e dimentica metodo, se si desidera attendere, è necessario contrassegnarlo come async Task.

Nel caso in cui, se si vuole ancora attendere, poi avvolgerla in questo modo await Task.Run(() => blah())

51

Se è possibile modificare la firma della funzione per async Task quindi è possibile utilizzare il codice presentato here

2

Non avete davvero bisogno di fare nulla manualmente, await parola chiave mette in pausa l'esecuzione funzione fino blah() rendimenti.

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 è tipo di oggetto blah() rendimenti

non si può davvero await una funzione void modo LoadBlahBlah() non può essere void

+0

voglio aspettare per 'LoadBlahBlah()' per finire, non 'blah()' – MBZ

+0

@MBZ aggiornato risposta – Mayank

+5

Purtroppo asincrona metodi vuoti fanno non mettere in pausa l'esecuzione (a differenza dei metodi Task asincroni) – ghord

17

La soluzione migliore è quella di utilizzare async Task. È necessario evitare async void per diversi motivi, uno dei quali è la componibilità.

Se il metodo non può essere fatto per tornare Task (ad esempio, è un gestore di eventi), quindi è possibile utilizzare SemaphoreSlim per avere il segnale metodo quando si è in procinto di uscire. Considera di farlo in un blocco finally.

2

fare un AutoResetEvent, chiamare la funzione, quindi attendere AutoResetEvent e quindi impostarlo all'interno di async vuoto quando si sa che è fatto.

Si può anche aspettare su un compito che torna dalla tua asincrona vuoto

Problemi correlati