12 Stimmen

Unterschied zwischen ConfigureAwait(false) und dem Weglassen von await?

Sie haben die folgende Methode:

async Task DoWorkAsync();

Gibt es einen Unterschied in der Funktionalität zwischen den folgenden beiden Aufrufen:

1. DoWorkAsync();
2. await DoWorkAsync().ConfigureAwait(false);

Der einzige Unterschied, den ich sehe, ist, dass Visual Studio eine Warnung ausgibt, wenn Sie den ersten verwenden, die besagt, dass die Methodenausführung ohne das Ergebnis abgewartet wird.

12voto

Stephen Cleary Punkte 402664

Gibt es einen Unterschied in der Funktionalität zwischen den folgenden beiden Aufrufen:

  1. DoWorkAsync();
  2. await DoWorkAsync().ConfigureAwait(false);

Ja, sie sind völlig verschieden. Der erste startet die asynchrone Methode und setzt dann die aktuelle Methode sofort fort. Der zweite wartet (asynchron) auf das Ende der asynchronen Methode.

Es gibt zwei wesentliche semantische Unterschiede:

  1. Wann der Code nach dieser Zeile ausgeführt wird. Wenn du await DoWorkAsync verwendest, wird der nachfolgende Code erst nach Abschluss von DoWorkAsync ausgeführt. Wenn du einfach DoWorkAsync aufrufst, ohne darauf zu warten, wird der nachfolgende Code ausgeführt, sobald DoWorkAsync unterbrochen wird.
  2. Wie Ausnahmen behandelt werden. Wenn du await DoWorkAsync verwendest, werden Ausnahmen von DoWorkAsync natürlich weitergegeben. Wenn du einfach DoWorkAsync aufrufst, ohne darauf zu warten, werden Ausnahmen stillschweigend erfasst und auf die zurückgegebene Aufgabe gelegt (die ignoriert wird, daher die Compilerwarnung).

9voto

Jonathan Allen Punkte 65707

ConfigureAwait(false) sagt "den Synchronisierungskontext nicht einfangen". Das bedeutet, dass Sie immer noch auf die Ergebnisse warten, aber wenn es weiter geht, wird nicht versucht, Sie zurück auf den UI-Thread zu übertragen.

  • Wenn Sie eine Bibliothek für andere Personen schreiben, verwenden Sie immer ConfigureAwait(false), sonst könnten Deadlocks ausgelöst werden.

  • Wenn Sie eine Anwendung schreiben, die an die UI gebunden ist (z.B. WPF, Silverlight, Windows 8), sollten Sie NICHT ConfigureAwait(false) verwenden, da Sie auf dem falschen Thread weitermachen.

  • Wenn Sie eine an den Kontext gebundene Anwendung schreiben (z.B. ASP.NET MVC-Controller), sollten Sie NICHT ConfigureAwait(false) verwenden, da Sie auf dem falschen Thread weitermachen.

Referenz: http://www.infoq.com/articles/Async-API-Design

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X