2017-04-19 1 views
1

Ich möchte nur 2 Threads für die Schleife zu machen. Ich habe versucht, diesen Code:C# TPL for loop - Anzahl der Threads begrenzen

ParallelOptions po = new ParallelOptions { 
    MaxDegreeOfParallelism = 2 
}; 

Parallel.For(0, width, po, x => { 
    sb.Append(Thread.CurrentThread.ManagedThreadId); 
    sb.Append(Environment.NewLine); 
    for (int y = 0; y < height; y++) { 
     double a = (double)(x - (width/2))/(double)(width/4); 
     double b = (double)(y - (height/2))/(double)(height/4); 
    } 
}); 

Aber wenn ich Thread.CurrentThread.ManagedThreadId anzuzeigen, schafft es mehr als 2-IDs. Ich habe auch versucht, diesen Code vor Schleife hinzu:

ThreadPool.SetMaxThreads(2, 2); 
ThreadPool.SetMinThreads(2, 2); 

Aber es macht auch nichts ändern. Jemand hat vielleicht eine Idee, wie kann ich dieses Problem lösen?

+0

Ich hoffe, nicht mit 'String 'in einer Multithread-Umgebung, da es nicht thread-sicher ist – MickyD

+0

Ich benutze dies nur, um große Zeichenfolge mit allen Threads ID zu machen. Denkst du, dass dieser StringBuilder Probleme mit mehr als 2 Threads macht? –

+0

Ja. Verwenden Sie einfach 'Console.WriteLine (Environment.CurrentManagedThreadId)' oder 'Trace.TraceInformation .....' – MickyD

Antwort

2

Die MaxDegreeOfParallelism legt die maximale Anzahl von simultanen Threads fest, die für die Parallel.For() verwendet werden. Es bedeutet nicht, dass nur zwei Threads jemals verwendet werden.

Während der Ausführung der Parallel.For() können verschiedene Threads vom Threadpool zugewiesen werden, da Threadpool-Threads speziell für die Wiederverwendung vorgesehen sind.

Das folgende Programm demonstriert. Wenn Sie es ausführen, sehen Sie, dass die Gesamtzahl der verschiedenen Threads verwendet werden 2 überschreiten kann, aber die Gesamtzahl der Threads verwendet wird gleichzeitig nie mehr als 2.

using System; 
using System.Collections.Concurrent; 
using System.Threading; 
using System.Threading.Tasks; 

namespace ConsoleApp1 
{ 
    class Program 
    { 
     static void Main() 
     { 
      ParallelOptions po = new ParallelOptions 
      { 
       MaxDegreeOfParallelism = 2 
      }; 

      var activeThreads = new ConcurrentDictionary<int, bool>(); 

      Parallel.For(0, 100, po, x => 
      { 
       activeThreads[Thread.CurrentThread.ManagedThreadId] = true; 
       Console.WriteLine("Active threads: " + string.Join(", ", activeThreads.Keys)); 
       Thread.Sleep(200); 
       activeThreads.TryRemove(Thread.CurrentThread.ManagedThreadId, out bool unused); 
      }); 

      Console.ReadLine(); 
     } 
    } 
}