Pula wątków jest zwykle odpowiednia do krótkich zadań. Ma ograniczenie, że jest to ograniczone zasoby dla całej aplikacji (25 na procesor) i istnieje wiele klas wewnętrznych, które używają wątku, więc jeśli wykonasz wiele długich zadań, wykorzystasz wszystkie wątki.
W przypadku długotrwałych zadań lepiej jest użyć ręcznie utworzonego wątku, którego właściwość background ma wartość true.
Uwaga: W wersji .NET Framework 2.0, wartość Thread.CurrentPrincipal
nieruchomość jest propagowana do wątków roboczych w kolejce przy użyciu metody QueueUserWorkItem
. We wcześniejszych wersjach podstawowe informacje nie są propagowane.
Kiedy nie używać wątek Basen wątki
Istnieje kilka scenariuszy, w których wskazane jest, aby tworzyć i zarządzać własnymi wątki zamiast korzystania wątki puli wątków:
wymagany jest pierwszy wątek (!).
Wymagany jest wątek o określonym priorytecie.
Masz zadania, które powodują blokowanie wątku przez dłuższy czas. Pula wątków ma maksymalną liczbę wątków, więc duża liczba zablokowanych wątków wątków może uniemożliwić uruchamianie zadań.
Musisz umieścić nici w jedno-gwintowanym mieszkaniu. Wszystkie wątki ThreadPool znajdują się w mieszkaniu wielowątkowym.
Musisz mieć stabilną tożsamość powiązaną z nickiem lub poświęcić wątek na zadanie.
Jedna wielka różnica jest taka, że Nieobsłużone wyjątki na gwincie puli wątków zakończenia procesu; z tymi trzema wyjątkami:
ThreadAbortException
jest wyrzucane w wątku puli wątków, ponieważ Abort
nazwano.
An AppDomainUnloadedException
jest zgłaszany w wątku puli wątków, ponieważ domena aplikacji jest rozładowywana.
Wspólne środowisko uruchomieniowe języka lub proces hosta kończy wątek.
Niektóre dobre referencje są:
The Managed Thread Pool
Threading in C#
Programming the Thread Pool in the .NET Framework
Aktualizacja: w odpowiedzi na komentarze. Możesz użyć metody GetAvailableThreads
do określenia faktycznej liczby wątków w puli wątków w danym momencie. ThreadPool.GetMaxThreads
to inna ilość. Jest to maksymalna dozwolona liczba w puli, zanim żądania są w kolejce, a nie rzeczywista liczba wątków w puli.
Zgodnie z dokumentacją basen utrzymuje 250 wątków roboczych na procesor domyślnie. –
Niektóre długo działające zadania mogą wymagać właściwości tła, aby ustawić wartość fałsz, jeśli chcesz upewnić się, że wątek zakończy pracę przed zamknięciem aplikacji (oczywiście nie gwarantuje to, ale przynajmniej nie zamknie się w normalnych okolicznościach) – JoshBerke
@Fredrik Mörk: To brzmi jak literówka. Jest to 25 na rdzeń –