Jaka jest maksymalna liczba wątków, które można utworzyć w aplikacji C #? A co się stanie, gdy osiągniesz ten limit? Czy rzucono jakiś wyjątek?
c#
.net
multithreading
John Saunders
źródło
źródło
Odpowiedzi:
Nie ma żadnych ograniczeń. Maksymalna liczba wątków zależy od ilości dostępnych zasobów fizycznych. Szczegółowe informacje można znaleźć w artykule Raymonda Chena .
Jeśli chcesz zapytać, jaka jest maksymalna liczba wątków, prawdopodobnie robisz coś nie tak.
[ Aktualizacja : Po prostu nie interesuje nas: domyślne liczby wątków puli wątków .NET:
(Te liczby mogą się różnić w zależności od sprzętu i systemu operacyjnego)]
źródło
Mitch ma rację. To zależy od zasobów (pamięci).
Chociaż artykuł Raymonda jest poświęcony wątkom systemu Windows, a nie wątkom C #, logika dotyczy tego samego (wątki C # są mapowane na wątki systemu Windows).
Jednak, tak jak w C #, jeśli chcemy być całkowicie precyzyjni, musimy rozróżnić wątki „rozpoczęte” i „nie rozpoczęte”. Tylko rozpoczęte wątki faktycznie rezerwują miejsce na stosie (jak mogliśmy się spodziewać). Wątki nierozpoczęte alokują tylko informacje wymagane przez obiekt wątku (możesz użyć reflektora, jeśli jesteś zainteresowany rzeczywistymi składnikami).
Możesz to przetestować samodzielnie, porównaj:
z:
Umieść punkt przerwania w wyjątku (oczywiście z pamięci) w VS, aby zobaczyć wartość licznika. Oczywiście istnieje bardzo znacząca różnica.
źródło
Zrobiłem test na systemie 64-bitowym z konsolą C #, wyjątkiem jest rodzaj braku pamięci, przy użyciu 2949 wątków.
Zdaję sobie sprawę, że powinniśmy używać puli wątków, co robię, ale ta odpowiedź jest odpowiedzią na główne pytanie;)
źródło
Powinieneś używać puli wątków (lub asynchronicznych delgates, które z kolei używają puli wątków), aby system mógł zdecydować, ile wątków ma zostać uruchomionych.
źródło
Jeff Richter w CLR przez C #:
„W wersji 2.0 środowiska CLR maksymalna liczba wątków roboczych wynosi domyślnie 25 na procesor w maszynie, a maksymalna liczba wątków we / wy wynosi domyślnie 1000. Limit 1000 w rzeczywistości nie ma żadnego ograniczenia”.
Zauważ, że jest to oparte na .NET 2.0. Mogło się to zmienić w .NET 3.5.
[Edytuj] Jak zauważył @Mitch, jest to specyficzne dla puli wątków CLR. Jeśli tworzysz wątki bezpośrednio, zobacz komentarze @Mitch i innych.
źródło
Możesz to przetestować , używając tego skróconego kodu:
Uważaj na 32-bitowe i 64-bitowe tryby aplikacji.
źródło
Polecam uruchomienie metody ThreadPool.GetMaxThreads w debugowaniu
Dokumenty i przykłady: https://docs.microsoft.com/en-us/dotnet/api/system.threading.threadpool.getmaxthreads?view=netframework-4.8
źródło