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?
8
A
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ą:
- 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.
- Jeśli zainstalujesz (lub użyjesz biblioteki, która instaluje)
SynchronizationContext
podczas działania, zachowanie twoich metod się nie zmieni.
Powiązane problemy
- 1. Kiedy nie mogę używać ConfigureAwait (false)?
- 2. Dlaczego $ false -eq "" prawda?
- 3. Skonfiguruj ConfigureAwait (false) dla całego projektu/dll
- 4. Jaka jest różnica między Task.Yield, Task.Run i ConfigureAwait (false)?
- 5. Dlaczego atr_accessor jest potrzebny w Railsach?
- 6. MapHubs nie jest potrzebny w SignalR 1.01?
- 7. Czy rmic jest nadal potrzebny?
- 8. ConfigureAwait (fałsz) nadal zakleszczenia
- 9. Migracja ManyToManyField null prawda, puste prawda, nie jest rozpoznawany
- 10. Dlaczego PRAWDA == "PRAWDA" ma wartość PRAWDA w R?
- 11. python pandas/numpy Prawda/False to 1/0 mapowanie
- 12. JavaScript PRAWDA nie jest zdefiniowane ani w cudzysłowie
- 13. Aplikacja nie jest wyświetlany w najnowszych aplikacjach wymienia
- 14. NameError: nazwa „prawda” nie jest zdefiniowane
- 15. Jaka jest różnica między async: false i async: prawda w ajax jquery?
- 16. Czy potrzebny jest mechanizm Class.forName()?
- 17. Potrzebny jest lepszy język szablonowy
- 18. Czy nadal potrzebny jest ActionBarSherlock?
- 19. Czy KillTimer jest naprawdę potrzebny?
- 20. Jaki filtr Kalmana jest potrzebny?
- 21. Czy potrzebny jest pas akcji?
- 22. Dlaczego (prawda) jest zła praktyka?
- 23. Jaki jest potrzebny polimorfizm w OOP?
- 24. Czy DLR jest potrzebny w .NET 4.0?
- 25. Wywoływanie programu ConfigureAwait z akcji ASP.NET MVC
- 26. prawda i fałsz nie działają wewnątrz SUM()
- 27. Czy lotny jest potrzebny, w przypadku tylko zsynchronizowanego dostępu
- 28. Zdecyduj, kiedy należy użyć ConfigureAwait (fałsz)
- 29. Porady Rspec dotyczące testowania obiektów usługowych
- 30. Paszport jest uwierzytelniony() zawsze zwraca PRAWDA
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. –