Update: ASP.NET Core hat keineSynchronizationContext
. Wenn Sie mit ASP.NET Core arbeiten, spielt es keine Rolle, ob Sie verwenden ConfigureAwait(false)
oder nicht.
Für ASP.NET "Full" oder "Classic" oder was auch immer gilt der Rest dieser Antwort weiterhin.
Ursprünglicher Beitrag (für Nicht-Core-ASP.NET):
Dieses Video des ASP.NET-Teams enthält die besten Informationen zur Verwendung async
in ASP.NET.
Ich hatte gelesen, dass es leistungsfähiger ist, da es nicht die Thread-Kontexte zurück zum ursprünglichen Thread-Kontext wechseln muss.
Dies gilt für UI-Anwendungen, bei denen es nur einen UI-Thread gibt, mit dem Sie "synchronisieren" müssen.
In ASP.NET ist die Situation etwas komplexer. Wenn eine async
Methode die Ausführung fortsetzt, wird ein Thread aus dem ASP.NET-Thread-Pool abgerufen. Wenn Sie die Kontexterfassung mit deaktivieren ConfigureAwait(false)
, führt der Thread die Methode einfach direkt weiter aus. Wenn Sie die Kontexterfassung nicht deaktivieren, tritt der Thread erneut in den Anforderungskontext ein und führt die Methode weiter aus.
So ConfigureAwait(false)
sparen Sie nicht einen Thread Sprung in ASP.NET; Es erspart Ihnen die erneute Eingabe des Anforderungskontexts, dies ist jedoch normalerweise sehr schnell. ConfigureAwait(false)
Dies kann nützlich sein, wenn Sie versuchen, eine kleine Menge einer Anfrage parallel zu verarbeiten, TPL jedoch für die meisten dieser Szenarien besser geeignet ist.
Bei ASP.NET Web Api jedoch, wenn Ihre Anfrage in einem Thread eingeht und Sie auf eine Funktion warten und ConfigureAwait (false) aufrufen, die Sie möglicherweise in einen anderen Thread versetzen könnte, wenn Sie das Endergebnis Ihrer ApiController-Funktion zurückgeben .
Eigentlich kann man das nur tun await
. Sobald Ihre async
Methode auf trifft await
, wird die Methode blockiert, aber der Thread kehrt zum Thread-Pool zurück. Wenn die Methode zum Fortfahren bereit ist, wird jeder Thread aus dem Thread-Pool entnommen und zum Fortsetzen der Methode verwendet.
Der einzige Unterschied ConfigureAwait
in ASP.NET besteht darin, ob dieser Thread beim Fortsetzen der Methode in den Anforderungskontext wechselt.
Ich habe weitere Hintergrundinformationen in meinem MSDN-ArtikelSynchronizationContext
und meinem async
Intro-Blog-Beitrag .
HttpContext.Current
wird von ASP.NET übertragenSynchronizationContext
, das standardmäßig von Ihnen übertragen wirdawait
, aber nicht vonContinueWith
. OTOH, der Ausführungskontext (einschließlich Sicherheitsbeschränkungen) ist der in CLR über C # erwähnte Kontext und wird von beidenContinueWith
undawait
(auch wenn Sie ihn verwendenConfigureAwait(false)
) übertragen.