2017-09-13 4 views
0

Ich versuche, Multi-Threading zu verwenden. Ich möchte eine Liste von Task .there zwei Wahl für mich laufen, ich schreibe zwei Codes wie folgt:Verwenden Sie Parallel.ForEach oder füllen Sie die Liste <Task> von foreach

List<Task> taskList=new List<Task>(); 
     foreach (var item in itemList) 
     { 
      taskList.Add(Task.Factory.StartNew(()=> DoTasks(item,new Random().Next(15,40)))); 
     } 
     Task.WaitAll(taskList.ToArray()); 
     Console.WriteLine("All Tasks Done!"); 

Und:

Parallel.ForEach(itemList, item => DoTasks(item, new Random().Next(15, 40))); 
     Console.WriteLine("All Tasks Done!"); 

Meine Fragen:
Was ist besser in der Leistung ?
Hat Parallel.ForEach eine ThreadPool für die Verwaltung von geöffneten Aufgaben?
Gibt es einen Weg zu diesem besser?

+0

Dies hängt ganz davon ab, was die Aufgaben tun, es gibt viele Anwendungen, wo die parallele Ausführung für jeden einfach nicht angemessen ist. Bitte geben Sie ein wenig mehr Informationen darüber, was Sie erreichen möchten, um die beste Antwort zu erhalten. – Kodaloid

+0

@Dmitry das ist nur Beispielcode aber ich bearbeite Frage. –

+8

[Rennen Sie Ihre Pferde] (https://ericlippert.com/2012/12/17/performance-rant/) –

Antwort

0

Parallel.Foreach ist die bessere Wahl. Es wird den aktuellen Thread wiederverwenden, um DoTasks auszuführen, sodass die Gesamtzahl der Threads geringer ist als im ersten Fall. Außerdem wird die Ausführung sofort gestartet, während es im foreach-Fall zu einer gewissen Verzögerung zwischen einem Zeitpunkt, an dem Sie Tasks erstellt haben, und einem Zeitpunkt kommen kann, an dem der Scheduler zuerst ausgeführt wird.

Verwandte Themen