2008-09-28 11 views
114

Wie viele Threads können Sie maximal in einer C# -Anwendung erstellen? Und was passiert, wenn Sie dieses Limit erreichen? Wird eine Ausnahme irgendwie geworfen?Maximale Anzahl von Threads in einer .NET App?

+0

Die Antwort wird sich unterscheiden, wenn Sie auf der x64 VM ausgeführt werden oder die x86 VM –

+0

In Meine Situation, es ist x86, aber können Sie die Antwort für beide bieten, falls jemand anderes es braucht? –

Antwort

124

Es gibt keine inhärente Grenze. Die maximale Anzahl von Threads wird durch die Menge der verfügbaren physischen Ressourcen bestimmt. Siehe hierzu article by Raymond Chen für Einzelheiten.

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

[aktualisiert: Nur aus Interesse: .NET Threadpool Standardnummern von Threads:

  • 1023 in Framework 4.0 (32-Bit-Umgebung)
  • 32768 in Framework 4.0 (64-bit Umwelt)
  • 250 pro Kern in Framework 3.5
  • 25 pro Kern in Framework 2,0

(Diese Zahlen können je nach Hardware und Betriebssystem abhängig)]

+11

Wie hast du das herausgefunden? Weißt du, was .NET 4.5 ist oder was 5.0 sein wird? – LamonteCristo

+8

frage mich, wo diese Nummer kam von – RollRoll

+2

Sie können diesen Code verwenden, um die Anzahl zu erhalten: \t \t \t int WorkerThreads; \t \t \t int completionPortThreads; \t \t \t ThreadPool.GetMaxThreads (aus workerThreads, out completionPortThreads); – JALLRED

4

Jeff Richter in CLR via C#:

„Mit der Version 2.0 des CLR, die maximalen Anzahl der Worker-Threads standardmäßig auf 25 pro CPU in die Maschine und die maximale Anzahl der E/A Threads standardmäßig auf 1000. Ein Limit von 1000 ist praktisch keine Grenze. "

Hinweis: Dies basiert auf .NET 2.0. 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.

+3

Ich denke, Sie beziehen sich auf den Threadpool. –

+0

Sie verwechseln CLR 2.0 und .NET 2.0 in Ihrem Kommentar zu .NET 3.5. – bzlm

+0

Soweit ich weiß, hat der SP1 für .NET 2.0 (Teil von .NET 3.5) die Worker-Threads standardmäßig auf 250 pro CPU/Core für Thread-Pools geändert. –

24

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

Obwohl Raymonds Artikel auf Windows-Threads und nicht auf C# -Threads ausgerichtet ist, gilt die Logik auch für die gleichen (C# -Threads werden Windows-Threads zugeordnet).

Wie wir jedoch in C# sind, müssen wir, um vollständig präzise zu sein, zwischen "gestarteten" und "nicht gestarteten" Threads unterscheiden. 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 tatsächlich testen Sie selbst, vergleichen:

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) 
     { 
     } 
    } 

mit:

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) 
     { 
     } 
    } 

einen Haltepunkt in der Ausnahme Put (out of memory, natürlich) in VS den Wert zu sehen von Zähler. Es gibt natürlich einen sehr signifikanten Unterschied.

5

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.

+0

-1: Thread-Pool wird in mehreren der Kommentare erwähnt. –

+0

Die Antwort * ist *, um das System entscheiden zu lassen. –

+0

@Ian: Ich habe Sie abgelehnt, weil die gleiche Antwort neun Monate zuvor gegeben wurde. –

7

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ß, wir sollten mit Threading-Pool, die ich tun, aber diese Antwort ist, als Antwort auf die Hauptfrage;)