2017-09-13 28 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的情况下,创建任务的时刻和调度器首次运行的时刻之间可能会有一些延迟。