ConfigureAwait (false) wird nicht in Console / Win Service-Apps benötigt, richtig?

8

Ich habe seit einiger Zeit async / hazard verwendet, aber in letzter Zeit tiefer geforscht und viele Best-Practice-Tipps gelesen, in denen standardmäßig ConfigureAwait (false) verwendet wird, um Deadlocks zu verhindern und die Leistung zu verbessern. Ich will nur sicher gehen, dass ich etwas nicht verpasse, wenn ich annehme, dass das nur gilt, wenn es sich um einen aktuellen SynchronizationContext oder TaskScheduler im Spiel handelt, richtig? Wenn ich eine Windows-Dienst-App habe, die auf Nachrichten / Befehle / etc reagiert. asynchron verwendet es immer nur den Standard scheduler = wahrscheinlich den gleichen threadpool thread, auf den der supportet on ausgeführt wird, führt die Fortsetzung aus, daher kann kein Deadlock und kein Leistungsunterschied bei der Verwendung von ConfigureAwait (false) auftreten, richtig? Es ist nicht so, dass ich es nicht sagen kann, aber ich hasse Geräuschcode so sehr ...

    
Martin Sykora 12.09.2014, 22:20
quelle

1 Antwort

7

Im Allgemeinen ist dies wahr. Wenn Sie in einem Console- oder Serviceszenario arbeiten, ist SynchronizationContext nicht installiert ( standardmäßig ), so dass die continueOnCapturedContext -Option in ConfigureAwait keine Auswirkung hat, dh Sie können sie ohne es entfernen Ändern des Laufzeitverhaltens.

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

Die Hauptvorteile, diese sogar in einer Konsole oder einer Dienstanwendung zu integrieren, sind:

  1. Der Code wird später in anderen Anwendungen wiederverwendbar. Wenn Sie diesen Code erneut verwenden möchten, müssen Sie keine Fehler aufspüren, die entstehen, wenn Sie diesen Code nicht berücksichtigen.
  2. Wenn Sie beim Ausführen eine SynchronizationContext installieren (oder eine Bibliothek verwenden, die installiert), ändert sich das Verhalten Ihrer Methoden nicht.
Reed Copsey 12.09.2014, 22:26
quelle

Tags und Links