Aspetta un metodo asincrono vuoto

Come posso aspettare che un metodo void async finisca il suo lavoro?

per esempio, ho una funzione come di seguito:

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

ora voglio assicurarmi che tutto sia stato caricato prima di continuare da qualche altra parte.

La migliore pratica è contrassegnare la funzione async void solo se si tratta di metodo fire and forget, se si desidera attendere, è necessario contrassegnarlo come async Task .

Nel caso in cui si voglia ancora attendere, quindi avvolgerlo in questo modo await Task.Run(() => blah())

Se è ansible modificare la firma della funzione in async Task è ansible utilizzare il codice presentato qui

La soluzione migliore è utilizzare async Task . Si dovrebbe evitare il async void per diversi motivi, uno dei quali è la componibilità.

Se non è ansible eseguire il metodo per restituire Task (ad esempio, è un gestore di eventi), è ansible utilizzare SemaphoreSlim per ottenere il segnale del metodo quando sta per uscire. Considera di farlo in un blocco finale.

Non hai davvero bisogno di fare nulla manualmente, await parola chiave sospenda l’esecuzione della funzione fino a quando blah() ritorna.

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

T è il tipo di object che blah() restituisce

Non puoi davvero await una funzione di void modo che LoadBlahBlah() non possa essere void

fare un AutoResetEvent, chiamare la funzione, quindi attendere AutoResetEvent e quindi impostarlo all’interno del vuoto asincrono quando si sa che è fatto.

Puoi anche aspettare un Task che ritorna dal tuo async nullo