2017-09-13 56 views
0

我想使用多線程。我想運行的Task列表。還有在兩個選擇對我來說,我喜歡寫在下面兩個代碼:使用Parallel.ForEach或填寫列表<Task>通過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!"); 

這:

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

我的問題:
這是更好的性能?
Parallel.ForEach是否有ThreadPool用於管理打開的任務?
有什麼辦法可以讓這個更好?

+0

這完全取決於任務在做什麼,有很多應用程序運行並行for-每個都不恰當,所以請提供更多的信息,解釋你正試圖完成以獲得最佳答案。 – Kodaloid

+0

@Dmitry這只是示例代碼,但我編輯的問題。 –

+8

[比賽你的馬](https://ericlippert.com/2012/12/17/performance-rant/) –

回答

0

Parallel.Foreach是更好的選擇。它將重新使用當前線程執行DoTasks,因此線程總數將少於第一種情況。另外,它將立即開始執行,而在foreach的情況下,創建任務的時刻和調度器首次運行的時刻之間可能會有一些延遲。