Wenn ich ConfigureAwait (false) nicht verwenden kann?

8

Gemäß Best Practices wird empfohlen, .ConfigureAwait(false) mit async/await Keywords zu verwenden, wenn Sie:

%Vor%

Können Sie mir bitte ein Beispiel für eine Situation geben, in der ich .ConfigureAwait(false) nicht benutzen kann?

    
Andrei 03.09.2015, 13:28
quelle

2 Antworten

11

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:

%Vor%

Wenn Sie von ConfigureAwait zurückkehren, sind Sie nicht mehr im UI-Thread. Dies wird InvalidOperationException verursachen.

    
Yuval Itzchakov 03.09.2015, 13:32
quelle
1

Aus dem source: Asynchrone .NET-Clientbibliotheken für Ihre HTTP-API und Kenntnis der asynchronen / abwartenden Auswirkungen :

  

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 Methode GetAwaiter 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!

    
Rahul Tripathi 03.09.2015 13:39
quelle