2016-03-29 13 views
1

dem Code auf dem MSDN article über ParallelOptions.MaxDegreeOfParallelism, habe ich versucht, die folgende ...ParallelOptions.MaxDegreeOfParallelism nichts zu tun

ParallelOptions po = new ParallelOptions { 
    MaxDegreeOfParallelism = 2 
}; 
Parallel.ForEach(files, (currentFile) => { 
    String filename = System.IO.Path.GetFileName(currentFile); 
    Bitmap bitmap = new Bitmap(currentFile); 
    bitmap.RotateFlip(RotateFlipType.Rotate180FlipNone); 
    bitmap.Save(Path.Combine(newDir, filename)); 
    Console.WriteLine("Processing {0} on thread {1}", filename, Thread.CurrentThread.ManagedThreadId); 
}); 

jedoch an den Thread-IDs suchen ausgegeben wird, kann ich sehen, dass es doesn mache keinen Unterschied, wenn ich MaxDegreeOfParallelism einstelle oder nicht. Wenn ich meinen CPU-Monitor ansehe, kann ich alle Kerne in Aktion sehen, selbst wenn ich MaxDegreeOfParallelism auf 2 setze.

Fehle ich den Punkt hier? Ich dachte, die Idee wäre, die Anzahl der Threads zu begrenzen?

Antwort

6

Es sieht nicht so aus, als ob Sie po in Parallel.ForEach übergeben, so dass es nur den Standard verwendet. Verwenden Sie an overload von Parallel.ForEach, dass Sie die ParallelOptions in, vielleicht, diese passieren lässt:

Parallel.ForEach(files, po, (currentFile) => { 
+0

Als Jen in 2 Minuten vor Ihnen kam, ich will, dass als Antwort markieren, aber trotzdem danke, wie bei Ihnen ebenso klar war. Bitte beachten Sie meinen Kommentar dort, warum ich diesen ziemlich offensichtlichen Punkt verpasst habe! –

+2

@AvrohomYisroel Es ist eigentlich das Gegenteil, vcsjones schlug mich dazu ;-) – Jens

+0

@Jens, oops, du hast Recht. In diesem Fall werde ich dies als die Antwort stattdessen markieren. Danke euch beiden trotzdem! –

3

Sie sind nicht die ParallelOptions Sie in Ihrer Schleife definieren verwenden. Sie haben eine andere Überlastung zu verwenden:

Parallel.ForEach<TSource> Method (IEnumerable<TSource>, ParallelOptions, Action<TSource>) 

https://msdn.microsoft.com/en-us/library/dd783747(v=vs.110).aspx

ParallelOptions po = new ParallelOptions { 
    MaxDegreeOfParallelism = 2 
}; 
Parallel.ForEach(files, po, (currentFile) => { 
    String filename = System.IO.Path.GetFileName(currentFile); 
    Bitmap bitmap = new Bitmap(currentFile); 
    bitmap.RotateFlip(RotateFlipType.Rotate180FlipNone); 
    bitmap.Save(Path.Combine(newDir, filename)); 
    Console.WriteLine("Processing {0} on thread {1}", filename, Thread.CurrentThread.ManagedThreadId); 
}); 
+0

Ich habe mich darüber gewundert, aber die einzigen Beispiele, die ich von MaxDegreeOfParallelism gesehen habe, zeigten nicht, wie man es in der Schleife verwendet, also nahm ich dummerweise an, dass es vielleicht eine statische Eigenschaft setzte. Es schien merkwürdig, da ich eine Instanz von ParallelOptions erstellt habe! Vielen Dank –