Sie "kann nicht" ConfigureAwait(false)
verwenden, wenn Sie sich wirklich um den Synchronisationskontext kümmern, in dem Sie sich befinden. Stellen Sie sich beispielsweise Folgendes in einer GUI-Anwendung vor:
Wenn Sie von ConfigureAwait
zurückkehren, sind Sie nicht mehr im UI-Thread. Dies wird InvalidOperationException
verursachen.
Wenn Sie auf eine Methode mit dem Schlüsselwort await warten, Compiler generiert einen Haufen Code für Sie. Einer der Gründe dafür Aktion ist die Synchronisierung mit dem UI- (oder Haupt) -Thread. Der Schlüssel Bestandteil dieser Funktion ist
SynchronizationContext.Current
which Ruft den Synchronisierungskontext für den aktuellen Thread ab.SynchronizationContext.Current
wird abhängig von den Umgebung, in der Sie sich befinden. Die MethodeGetAwaiter
von Task sucht nach %Code%. Wenn der aktuelle Synchronisationskontext ist nicht null, wird die Fortsetzung, die an diesen Erwarter weitergegeben wird, erhalten in diesen Synchronisationskontext zurückgeschrieben.Beim Verzehr einer Methode, die die neue asynchrone Sprache verwendet Features, in einer blockierenden Art und Weise, werden Sie mit einem Deadlock enden, wenn Sie haben einen verfügbaren SynchronizationContext. Wenn Sie verbrauchen solche Methoden blockierend (Warten auf den Task with Wait Methode oder das Ergebnis direkt aus der Ergebniseigenschaft der Aufgabe), Sie werden den Haupt-Thread gleichzeitig blockieren. Wann Schließlich wird die Task innerhalb dieser Methode im Threadpool abgeschlossen wird die Fortsetzung aufrufen, um zurück zum Hauptthread zu gelangen weil
SynchronizationContext.Current
verfügbar und erfasst ist. Aber Hier ist ein Problem: Der UI-Thread ist blockiert und Sie haben eine Deadlock!
Tags und Links .net c# task-parallel-library async-await asynchronous