2014-12-03 11 views
7

stavo facendo qualche codifica in ASP.NET quando mi sono imbattuto in questo:È sicuro utilizzare async/await nei gestori di eventi ASP.NET?

protected async void someButtonClickHandler(...) 
{ 
    if(await blah) 
     doSomething(); 
    else 
     doSomethingElse(); 
} 

Dopo aver chiesto this domanda ho ottenuto una migliore comprensione di come async/await opere. Ma poi mi ha colpito è sicuro usare async/await nel modo mostrato sopra?
Voglio dire dopo aver chiamato await blah il chiamante continua l'esecuzione. Il che significa che potrebbe restituire la risposta al client prima del completamento di await blah. È giusto? E se questo è il caso, cosa succede a doSomething()/doSomethingElse(). Saranno mai giustiziati? Se vengono eseguiti, l'utente vede gli effetti delle loro modifiche?
Nel mio caso questi metodi modificano alcuni dati visualizzati all'utente, ma mi piacerebbe anche sapere cosa succederebbe nel caso generale.

+0

È per i moduli Web? –

+0

@JonathanAllen si. – atoMerz

risposta

13

Sì, è sicuro, ma non è consigliabile. Il recommended way to do this is via RegisterAsyncTask. Tuttavia, ASP.NET (Web Forms) gestirà correttamente i gestori di eventi async void.

La risposta non viene visualizzata al client quando il gestore await s; lo await produce solo runtime ASP.NET e non il client. Il runtime ASP.NET è consapevole del fatto che il gestore eventi non è stato completato, quindi sa di non inviare la risposta. Al termine del gestore eventi, il runtime di ASP.NET risponde inviando la risposta in quel momento.

Ho un MSDN article on async ASP.NET che potrebbe risultare utile. Se sei curioso di sapere come il runtime di ASP.NET è a conoscenza del fatto che il gestore async non è stato completato, lo copro in an earlier MSDN article.

+1

il tuo primo link è attualmente danneggiato – Fredou

+1

@Fredou: il collegamento è corretto; è un problema con il sito ASP.NET. Basta premere Aggiorna fino a quando il contenuto non viene visualizzato. –

Problemi correlati