ThreadPool.QueueUserWorkItem a Task.Factory.StartNew

79

Jaka jest różnica między poniższymi

ThreadPool.QueueUserWorkItem

vs

Task.Factory.StartNew

Jeśli powyższy kod jest wywoływany 500 razy dla jakiegoś długotrwałego zadania, czy oznacza to, że wszystkie wątki puli wątków zostaną zajęte?

A może TPL (druga opcja) będzie wystarczająco inteligentna, aby po prostu zajmować wątki mniejsze lub równe liczbie procesorów?

stackoverflowuser
źródło

Odpowiedzi:

93

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 TaskAPI 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 ...

Jon Skeet
źródło
4
Obawiam się twardej, szybkiej reguły, TaskCreationOptions.LongRunningktó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ą?
Marc
1
@Marc: Cóż, to zależy od harmonogramu - ale planowanie jawnie długo działających zadań w puli wątków IMO byłoby dość szalonym harmonogramem.
Jon Skeet,
Żeby
Brad Semrad
@Brad: Dzięki, dodam link do mojej odpowiedzi.
Jon Skeet
1
Dodałbym również, że TPL umożliwia określenie własnego harmonogramu, w tym niestandardowych harmonogramów, które pozwalają kontrolować własną współbieżność: msdn.microsoft.com/en-us/library/ee789351.aspx
Chris Shain,