26 Stimmen

`ConfigureAwait(false)` in Console/Win-Dienst Apps nicht erforderlich, oder?

Ich habe async/await schon seit geraumer Zeit verwendet, aber vor kurzem tiefer in die Materie eingetaucht und viele bewährte Tipps gelesen, die besagen, dass man standardmäßig immer ConfigureAwait(false) verwenden sollte, um Deadlocks zu verhindern und die Leistung zu verbessern.

Ich möchte nur sicherstellen, dass ich nichts übersehe, wenn ich vermute, dass dies nur gilt, wenn tatsächlich ein aktueller SynchronizationContext oder TaskScheduler im Spiel ist, richtig?

Wenn ich eine Windows-Service-App habe, die auf Nachrichten/Befehle usw. asynchron antwortet, verwendet sie immer den Standard-Scheduler = wahrscheinlich wird der gleiche Threadpool-Thread, auf dem das Awaitable abgeschlossen wurde, die Fortsetzung ausführen, daher kann kein Deadlock auftreten und es gibt keinen Leistungsunterschied durch die Verwendung von ConfigureAwait(false), richtig?

Es ist nicht so, dass ich es dort nicht platzieren kann, aber ich hasse lauten Code so sehr...

19voto

Reed Copsey Punkte 536986

Im Allgemeinen ist dies wahr. Wenn Sie in einem Konsolen- oder Service-Szenario arbeiten, ist standardmäßig kein SynchronizationContext installiert, sodass die continueOnCapturedContext-Option in ConfigureAwait keine Auswirkung hat, was bedeutet, dass Sie sie sicher entfernen können, ohne das Laufzeitverhalten zu ändern.

Es kann jedoch Ausnahmen geben, daher würde ich oft empfehlen, Ihren Code auch bei Bedarf mit ConfigureAwait(false) zu schreiben.

Die Hauptvorteile des Einbeziehens auch in einer Konsolen- oder Serviceanwendung sind:

  1. Der Code wird später in anderen Anwendungen wiederverwendbar. Wenn Sie sich dazu entscheiden, diesen Code wiederzuverwenden, müssen Sie keine Fehler verfolgen, die aus dem Nicht-Einbeziehen entstehen.
  2. Wenn Sie zufällig (oder eine Bibliothek, die installiert ist) während des Betriebs einen SynchronizationContext installieren, ändert sich das Verhalten Ihrer Methoden nicht.

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