Czym jest pula wątków? Dlaczego używać poolów wątków? Jak korzystać z poolów wątków?
1. Czym jest pula wątków?
Klasa ThreadPool w .NET Framework zapewnia pulę wątków, która może być używana do wykonywania zadań, wysyłania zadań, obsługi asynchronicznych operacji I/O, oczekiwania w imieniu innych wątków oraz obsługi timerów. Czym więc jest pula wątków? Pula wątków to w rzeczywistości "pula", która przechowuje obiekty wątków i zapewnia podstawowe metody, takie jak ustawianie minimalnej/maksymalnej liczby wątków w puli, kolejkowanie metod do wykonania itd. ThreadPool to klasa statyczna, więc można jej używać bezpośrednio bez tworzenia obiektów.
2. Dlaczego używać pul wątków? Jakie są korzyści?
Oficjalna strona Microsoftu mówi następująco: Wiele aplikacji tworzy dużą liczbę wątków, które są uśpione, czekając na wydarzenia. Jest też wiele wątków, które mogą przejść w stan hibernacji tylko po to, by okresowo budzić się i sprawdzać informacje o stanie zmiany lub aktualizacji. Pule wątków, pozwalające efektywniej korzystać z wątków w puli wątków roboczych zarządzanych przez system.
Mówiąc prosto, każdy nowy wątek musi zajmować miejsce w pamięci i inne zasoby, a przy tak wielu nowych wątkach wiele z nich jest uśpionych lub czeka na zwolnienie zasobów. Wiele wątków wykonuje tylko drobne prace okresowo, takie jak odświeżanie danych itp., które są zbyt marnotrawne do rysowania, a rzadko zdarza się, by duża liczba wątków wybuchła w rzeczywistym programowaniu i zakończyła się w krótkim czasie. Dlatego zaproponowano koncepcję pool wątków. Jeśli aplikacja wyśle kolejne żądanie do puli wątków, wątek w stanie oczekującym zostaje aktywowany i wykonuje zadanie bez tworzenia nowego wątku, co oszczędza dużo narzutu. System automatycznie niszczy wątki tylko wtedy, gdy liczba wątków osiągnie maksymalną liczbę wątków. Dzięki temu korzystanie z pul wątków pozwala uniknąć dużych kosztów tworzenia i niszczenia, zapewnia lepszą wydajność i stabilność, a po drugie, programiści mogą skupić się na innych zadaniach, przekazując wątki zarządzaniu systemem.
3. Jak korzystać z pul wątków?
W rzeczywistości pule wątków są bardzo proste w użyciu, jak następuje
a. Ustaw maksymalną i minimalną pulę wątków:
ThreadPool.SetMaxThreads (int workerThreads,int completionPortThreads) Ustaw liczbę żądań dla puli wątków, które mogą być aktywne jednocześnie. Wszystkie żądania większe niż ta liczba pozostaną w kolejce do czasu udostępnienia wątku puli wątków. Możesz też ustawić minimalną liczbę wątków.
b. Dodaj zadania do puli wątków:
ThreadPool.QueueUserWorkItem(nowy WaitCallback(nazwa metody));
lub ThreadPool.QueueUserWorkItem(nowy WaitCallback(nazwa metody), parametr);
Na przykład, jeśli maksymalnie 5 wątków w puli wątków wykona metodę 60 razy, całkowite wynagrodzenie za 5 lat jest następujące:
Jeśli nie używasz puli wątków, możesz musieć otworzyć 60 wątków, aby wykonać metodę Run() asynchronicznie, co jest stratą miejsca. Teraz używamy do 5 wątków, które można wykonać w 1 sekundę, a wydajność i wydajność są bardzo dobre.
|