Aggiornamento: ASP.NET Core non ha aSynchronizationContext
. Se sei su ASP.NET Core, non importa se lo usi ConfigureAwait(false)
o meno.
Per ASP.NET "Completo" o "Classico" o qualsiasi altra cosa, il resto di questa risposta si applica ancora.
Post originale (per ASP.NET non Core):
Questo video del team ASP.NET contiene le migliori informazioni sull'uso di async
ASP.NET.
Avevo letto che è più performante in quanto non deve riportare i contesti di thread al contesto di thread originale.
Questo è vero con le applicazioni UI, dove c'è solo un thread UI che devi "sincronizzare" di nuovo.
In ASP.NET, la situazione è un po 'più complessa. Quando un async
metodo riprende l'esecuzione, prende un thread dal pool di thread ASP.NET. Se si disabilita l'acquisizione del contesto tramite ConfigureAwait(false)
, il thread continua a eseguire direttamente il metodo. Se non si disabilita l'acquisizione del contesto, il thread rientrerà nuovamente nel contesto della richiesta e continuerà a eseguire il metodo.
Quindi ConfigureAwait(false)
non ti salva un salto di thread in ASP.NET; ti salva il rientro del contesto della richiesta, ma normalmente è molto veloce. ConfigureAwait(false)
potrebbe essere utile se stai tentando di eseguire una piccola quantità di elaborazione parallela di una richiesta, ma in realtà TPL si adatta meglio alla maggior parte di quegli scenari.
Tuttavia, con ASP.NET Web Api, se la richiesta arriva su un thread e si attende una funzione e si chiama ConfigureAwait (false) che potrebbe potenzialmente inserirti in un thread diverso quando si restituisce il risultato finale della funzione ApiController .
In realtà, basta farlo await
e farlo. Una volta che il async
metodo ha raggiunto un await
, il metodo viene bloccato ma il thread ritorna al pool di thread. Quando il metodo è pronto per continuare, qualsiasi thread viene strappato dal pool di thread e utilizzato per riprendere il metodo.
L'unica differenza ConfigureAwait
in ASP.NET è se quel thread entra nel contesto della richiesta quando si riprende il metodo.
Ho ulteriori informazioni di base nel mio articolo su MSDNSynchronizationContext
e nel mio async
post sul blog di introduzione .
HttpContext.Current
viene trasmesso da ASP.NETSynchronizationContext
, che viene trasmesso per impostazione predefinita quando l'utenteawait
, ma non scorreContinueWith
. OTOH, il contesto di esecuzione (comprese le restrizioni di sicurezza) è il contesto menzionato in CLR tramite C # ed è gestito da entrambiContinueWith
eawait
(anche se si utilizzaConfigureAwait(false)
).