2009-06-29 27 views

Odpowiedz

19

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.

+0

Zgodnie z dokumentacją basen utrzymuje 250 wątków roboczych na procesor domyślnie. –

+0

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

+0

@Fredrik Mörk: To brzmi jak literówka. Jest to 25 na rdzeń –

0

Funkcja tworzenia wątków tworzy wątki i przypisuje pracę do wolnego wątku. W ten sposób zapobiega się tworzeniu i usuwaniu wątków dla każdego elementu pracy, ponieważ tworzenie i usuwanie wątków jest relatywnie kosztowną operacją.

3

W wątku zawiera wiele wątków, które są gotowe do użycia, co może wyeliminować koszty tworzenia nowych wątków, co dzieje się podczas tworzenia normalnego wątku.

7

Różnica nie polega na tym, że same nici zachowują się tak samo, różnica polega na tym, kto zarządza czasem życia nici i jak z nich korzystasz.

Pula wątków w .net jest pulą wątków, która będzie rosnąć lub zmniejszać się, podczas kolejki do puli wątków do przetworzenia, ustali, czy musi rozpocząć nowy wątek, czy też będzie używał istniejącego wątku. Nie musisz jawnie tworzyć wątków.

To jest miłe, ale wadą tego jest ograniczona liczba wątków dostępnych w wątku, więc jeśli ustawisz w kolejce długotrwałe zadanie, może to mieć negatywny wpływ na twoją aplikację, ponieważ możesz użyć wątek wątku, którego może chcieć użyć coś innego.

Zobacz ten article o puli wątków

Powiązane problemy