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?
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?
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)]
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:
static void DummyCall()
{
Thread.Sleep(1000000000);
}
static void Main(string[] args)
{
int count = 0;
var threadList = new List<Thread>();
try
{
while (true)
{
Thread newThread = new Thread(new ThreadStart(DummyCall), 1024);
newThread.Start();
threadList.Add(newThread);
count++;
}
}
catch (Exception ex)
{
}
}
z:
static void DummyCall()
{
Thread.Sleep(1000000000);
}
static void Main(string[] args)
{
int count = 0;
var threadList = new List<Thread>();
try
{
while (true)
{
Thread newThread = new Thread(new ThreadStart(DummyCall), 1024);
threadList.Add(newThread);
count++;
}
}
catch (Exception ex)
{
}
}
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.
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.
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.
Możesz to przetestować , używając tego skróconego kodu:
private static void Main(string[] args)
{
int threadCount = 0;
try
{
for (int i = 0; i < int.MaxValue; i ++)
{
new Thread(() => Thread.Sleep(Timeout.Infinite)).Start();
threadCount ++;
}
}
catch
{
Console.WriteLine(threadCount);
Console.ReadKey(true);
}
}
Uważaj na 32-bitowe i 64-bitowe tryby aplikacji.
Polecam uruchomienie metody ThreadPool.GetMaxThreads w debugowaniu
ThreadPool.GetMaxThreads(out int workerThreadsCount, out int ioThreadsCount);
Dokumenty i przykłady: https://docs.microsoft.com/en-us/dotnet/api/system.threading.threadpool.getmaxthreads?view=netframework-4.8