Jeśli zamierzasz rozpocząć długotrwałe zadanie z TPL, powinieneś określić TaskCreationOptions.LongRunning
, co oznacza, że nie planuje go w puli wątków. (EDYCJA: jak zauważono w komentarzach, jest to decyzja specyficzna dla harmonogramu i nie jest to twarda i szybka gwarancja, ale mam nadzieję, że każdy rozsądny harmonogram produkcji uniknąłby planowania długotrwałych zadań w puli wątków).
Zdecydowanie nie należy samodzielnie planować dużej liczby długotrwałych zadań w puli wątków. Uważam, że obecnie domyślny rozmiar puli wątków jest dość duży (ponieważ często jest nadużywany w ten sposób), ale zasadniczo nie powinien być używany w ten sposób.
Celem puli wątków jest uniknięcie krótkich zadań, które powodują duże obciążenie związane z tworzeniem nowego wątku w porównaniu z czasem, w którym faktycznie działają. Jeśli zadanie będzie działać przez długi czas, wpływ utworzenia nowego wątku i tak będzie stosunkowo niewielki - i nie chcesz, aby potencjalnie skończyły się wątki puli wątków. (Jest to mniej prawdopodobne, teraz, ale ja zrobiłem doświadczenie to na wcześniejszych wersjach .NET).
Osobiście, gdybym miał możliwość, to bym na pewno korzystać TPL na tej podstawie, że Task
API jest bardzo ładne - ale należy pamiętać, aby powiedzieć TPL, że można oczekiwać, aby uruchomić zadanie przez długi czas.
EDYCJA: Jak zauważono w komentarzach, zobacz także post na blogu zespołu PFX dotyczący wyboru między TPL a pulą wątków :
Podsumowując, powtórzę, co już stwierdził programista ThreadPool zespołu CLR:
Task is now the preferred way to queue work to the thread pool.
EDYCJA: Również z komentarzy pamiętaj, że TPL umożliwia korzystanie z niestandardowych harmonogramów , jeśli naprawdę chcesz ...
TaskCreationOptions.LongRunning
która zawsze będzie unikać puli wątków. Wydaje się, że jest to bardziej dyrektywa niż gwarancja wdrożenia. Czy jestem na tym poza bazą?