2016-12-25 1 views
-1

Gibt es eine Möglichkeit zur Wiederverwendung von Threads in aufeinanderfolgenden Aufrufen von Parallel.ForEach Schleife verwendet? Ich tue es, weil ich verstehe, dass die Erstellung von Threads teuer sein kann.Parallel.For/Foreach Threads wiederverwenden C#

Das ist, was ich tun möchte:

var collection = CreateMyCollection() 
var pool = CreateThreadPool() 
for(int i =0 ; i<1000 ; i++) 
     Parallel.ForEach(pool, collection, (element) => Calculate(element, i)) 

Ist es möglich?

Anmerkung: Ich kann die externe Schleife parallize statt (hard dependancy zwischen 'i'S')

+3

Ich möchte sagen, dass die Threads, die die 'Parallel'-Methoden verwenden, nur aus dem Aufgabenpool kommen, also sollten Tasks im Wesentlichen dieselben Threads wiederverwenden. – Abion47

+0

Wow, ich werde die Dokumentation dafür suchen, hast du einen Link? –

Antwort

2

Parallel.ForEach Teil TPL ist. Standardmäßig wird TaskSceduler, der für das Einreihen von Arbeitsaufgaben in Threads zuständig ist, ThreadPool verwenden.

Eine Instanz der TaskScheduler-Klasse stellt einen Taskplaner dar. Ein Taskplaner stellt sicher, dass die Arbeit einer Aufgabe schließlich ausgeführt wird. Der Standard-Taskplaner basiert auf dem Thread mit Thread , der Work-Stealing für Lastenausgleich, Thread Injektion/Ruhestand für maximalen Durchsatz und insgesamt gute Leistung bietet. Es sollte für die meisten Szenarien ausreichen. Die TaskScheduler-Klasse dient auch als Erweiterungspunkt für alle anpassbare Planungslogik . Dazu gehören Mechanismen wie zum Beispiel, wie eine Aufgabe zur Ausführung geplant wird und wie geplante Aufgaben für Debugger ausgesetzt werden sollen. Wenn Sie spezielle Funktionen benötigen, können Sie einen benutzerdefinierten Scheduler erstellen und für bestimmte Aufgaben oder Abfragen aktivieren.

+0

Vielen Dank –