2014-09-12 9 views
8

Używam async/czekać na chwilę, ale zagłębił się ostatnio, i przeczytać wiele wskazówek najlepszych praktyk mówiąc, domyślnie zawsze używać ConfigureAwait (false), aby zapobiec zakleszczeniom i poprawić wydajność. Po prostu chcę się upewnić, że czegoś mi nie brakuje, gdy zakładam, że to dotyczy tylko sytuacji, w której jest aktualny bieżący SynchronizationContext lub TaskScheduler w grze, prawda? Jeśli mam aplikację usługi Windows, która odpowiada na komunikaty/polecenia/etc. asynchronicznie, zawsze używa tylko domyślnego programu planującego = prawdopodobnie tego samego wątku wątku, którego oczekiwane zakończenie wykona kontynuację, a zatem nie można uzyskać zakleszczenia ani różnicy wydajności za pomocą funkcji ConfigureAwait (false), poprawne? To nie tak, że nie mogę tego tam umieścić, ale nienawidzę kodu szumowego tak bardzo ...ConfigureAwait (false) nie jest potrzebny w aplikacjach usługowych Console/Win, prawda?

+1

Najlepiej powinieneś napisać kod, który jest modułowy i nie obchodzi go, czy działa w konsoli, usłudze windowsowej, witrynie ASP.NET lub projekcie w oknie (więc tak, powinieneś go umieścić, ponieważ twój kod mógł być uruchamiany w sytuacjach, w których byłby on potrzebny), ale czasami wiesz, że nie będzie on używany w takich sytuacjach (więc nie, nie powinieneś go wstawiać). To kwestia stylu kodowania. –

Odpowiedz

7

Ogólnie jest to prawda. Podczas pracy w scenariuszu Console lub Service domyślnie nie jest zainstalowany SynchronizationContext ()), więc opcja continueOnCapturedContext w ConfigureAwait nie będzie miała żadnego efektu, co oznacza, że ​​można bezpiecznie usunąć bez zmiany zachowania środowiska wykonawczego.

Jednak mogą istnieć wyjątki, więc często sugerowałbym napisanie kodu, w tym ConfigureAwait(false), jeśli to konieczne.

Główne zalety to nawet w tym aplikacji konsoli lub usług są:

  1. Kod staje wielokrotnego użytku w innych aplikacjach późniejszych. Jeśli zdecydujesz się na ponowne użycie tego kodu, nie będziesz musiał wyśledzić błędów, które powstają w wyniku nieuwzględnienia tego.
  2. Jeśli zainstalujesz (lub użyjesz biblioteki, która instaluje) SynchronizationContext podczas działania, zachowanie twoich metod się nie zmieni.
Powiązane problemy