Maximale Anzahl von Threads in einer .NET App?

Wie viele Threads können maximal in einer C # -Anwendung erstellt werden? Und was passiert, wenn Sie dieses Limit erreichen? Wird eine Ausnahme irgendwie geworfen?

Es gibt keine inhärente Grenze. Die maximale Anzahl von Threads wird durch die Menge der verfügbaren physischen Ressourcen bestimmt. Sehen Sie diesen Artikel von Raymond Chen für Details.

Wenn Sie fragen müssen, wie viele Threads maximal sind, machen Sie wahrscheinlich etwas falsch.

[ Update : Nur aus Interesse: .NET Thread Pool Standardnummern von Threads:

  • 1023 in Framework 4.0 (32-Bit-Umgebung)
  • 32768 in Framework 4.0 (64-Bit-Umgebung)
  • 250 pro core in Framework 3.5
  • 25 pro core in Framework 2.0

(Diese Zahlen können je nach Hardware und Betriebssystem variieren)]

Mitch hat Recht. Es hängt von Ressourcen (Speicher) ab.

Obwohl der Artikel von Raymond ausschließlich für Windows-Threads und nicht für C # -Threads verwendet wird, gilt dieselbe Logik (C # -Threads werden Windows-Threads zugeordnet).

Wie wir in C # sehen, müssen wir jedoch zwischen “gestarteten” und “nicht gestarteten” Threads unterscheiden, wenn wir vollkommen präzise sein wollen. Nur begonnene Threads reservieren tatsächlich Stack-Speicherplatz (wie wir es erwarten konnten). Nicht gestartete Threads weisen nur die Informationen zu, die von einem Thread-Objekt benötigt werden (Sie können reflector verwenden, wenn Sie an den tatsächlichen Mitgliedern interessiert sind).

Sie können es selbst testen, vergleichen Sie:

static void DummyCall() { Thread.Sleep(1000000000); } static void Main(string[] args) { int count = 0; var threadList = new List(); try { while (true) { Thread newThread = new Thread(new ThreadStart(DummyCall), 1024); newThread.Start(); threadList.Add(newThread); count++; } } catch (Exception ex) { } } 

mit:

  static void DummyCall() { Thread.Sleep(1000000000); } static void Main(string[] args) { int count = 0; var threadList = new List(); try { while (true) { Thread newThread = new Thread(new ThreadStart(DummyCall), 1024); threadList.Add(newThread); count++; } } catch (Exception ex) { } } 

Setzen Sie einen Haltepunkt in die Ausnahme (nicht im Speicher, natürlich) in VS, um den Wert des Zählers zu sehen. Es gibt natürlich einen sehr signifikanten Unterschied.

Ich habe einen Test auf einem 64-Bit-System mit c # -Konsole, die Ausnahme ist Art von nicht genügend Speicher, mit 2949 Threads.

Ich weiß, dass wir Threading Pool verwenden sollten, was ich tue, aber diese Antwort ist eine Antwort auf die Hauptfrage;)

Sie sollten den Threadpool (oder asynchrone Delgates, die wiederum den Threadpool verwenden) verwenden, damit das System entscheiden kann, wie viele Threads ausgeführt werden sollen.

Jeff Richter in CLR über C #:

“Bei der Version 2.0 der CLR ist die maximale Anzahl von Worker-Threads standardmäßig auf 25 pro CPU in der Maschine festgelegt, und die maximale Anzahl von E / A-Threads ist standardmäßig auf 1000 festgelegt. Eine Grenze von 1000 ist praktisch keine Begrenzung.”

Beachten Sie, dass dies auf .NET 2.0 basiert. Dies kann sich in .NET 3.5 geändert haben.

[Bearbeiten] Wie @Mitch darauf hingewiesen hat, ist dies spezifisch für den CLR ThreadPool. Wenn Sie Threads direkt erstellen, lesen Sie die Kommentare von @Mitch und anderen.