8

Mam aplikację w języku C# z listą zadań do wykonania. Chcę równolegle wykonywać jak najwięcej tej pracy. Jednak muszę mieć możliwość kontrolowania maksymalnej ilości równoległych zadań.Zadania kontra ThreadPool

Z tego co rozumiem, jest to możliwe przy użyciu ThreadPool lub Tasks. Czy jest jakaś różnica w której używam? Moją główną troską jest to, aby kontrolować, ile wątków jest aktywnych jednocześnie.

+0

Czy jesteś absolutnie pewny, że musisz kontrolować ilość uruchomionych wątków? Lub po prostu trzeba kontrolować liczbę bieżących prac? – Gusdor

Odpowiedz

19

Proszę spojrzeć na ParallelOptions.MaxDegreeOfParallelism dla Task s.

Zaleca się korzystanie z zadań, ponieważ zapewniają one wyższy poziom abstrakcji niż ThreadPool.

Bardzo dobra lektura na ten temat można znaleźć pod numerem here. Naprawdę, niezbędna książka i jest za darmo :)

2

Można również utworzyć semafor, aby kontrolować liczbę wątków, które można wykonać za jednym razem. Możesz utworzyć nowy semafor, aw konstruktorze określić ile równoczesnych wątków może używać tego semafora za jednym razem. Ponieważ nie wiem, w jaki sposób zamierzasz używać wątków, byłby to dobry punkt wyjścia.

MSDN Article on the Semaphore class

-Wesley

2

Zadanie ma dla mnie bardzo czarującą cechę, można budować łańcuchy zadań. Które są wykonywane na niektórych wynikach zadania wcześniej. Funkcja, której często używam, jest następująca: Zadanie A działa w tle, aby wykonać długotrwałą pracę. Łączyłem Zadanie B po tym, wykonując tylko wtedy, gdy Zadanie A zakończyło się regularnie i skonfigurowałem je tak, aby działało na pierwszym planie, dzięki czemu mogę łatwo aktualizować kontrolki z wynikiem długiego działania Zadanie A.

5

W TPL można używać WithDegreeOfParallelism na ParallelEnumerable lub ParallelOptions.MaxDegreeOfParallism

Istnieje również CountdownEvent które mogą być lepszym rozwiązaniem, jeśli tylko przy użyciu niestandardowych tematów lub zadań.

W wersji ThreadPool, gdy używasz SetMaxThreads, globalnie dla AppDomain, więc możesz potencjalnie ograniczyć niepowiązany kod niepotrzebnie.

Nie można ustawić liczby wątków roboczych lub liczby wątków zakończenia operacji we/wy na liczbę mniejszą niż liczba procesorów w komputerze.

Jeśli hostuje się wspólne środowisko uruchomieniowe języka, na przykład przez Internetowe usługi informacyjne (IIS) lub serwer SQL, host może ograniczyć lub zablokować zmiany wielkości puli wątków.

Należy zachować ostrożność podczas zmiany maksymalnej liczby wątków w puli wątków. Chociaż twój kod może przynieść korzyści, zmiany mogą mieć niekorzystny wpływ na używane biblioteki kodów.

Ustawienie zbyt dużego rozmiaru wątku może spowodować problemy z wydajnością. Jeśli jednocześnie wykonywanych jest zbyt wiele wątków, narzut przełączania zadań staje się znaczącym czynnikiem.

Zgadzam się z drugą odpowiedź, że należy wykorzystać TPL nad ThreadPool jak jego lepszym abstrakcji wielowątkowości, ale jego możliwe do osiągnięcia tego, co chcesz w obu.

Powiązane problemy