C# 使用Parallel.ForEach或fill List<;任务>;按foreach

C# 使用Parallel.ForEach或fill List<;任务>;按foreach,c#,multithreading,foreach,C#,Multithreading,Foreach,我正在尝试使用多线程。我想运行一个任务列表。我有两个选择,我写两个代码如下: List<Task> taskList=new List<Task>(); foreach (var item in itemList) { taskList.Add(Task.Factory.StartNew(()=> DoTasks(item,new Random().Next(15,40)))); }

我正在尝试使用多线程。我想运行一个
任务列表
。我有两个选择,我写两个代码如下:

 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
是否有用于管理打开的任务的
ThreadPool

有什么更好的方法吗?

Parallel.Foreach是更好的选择。它将重用当前线程来执行dotask,因此线程总数将少于第一种情况。此外,它将立即开始执行,而在使用foreach的情况下,从创建任务到调度程序运行第一个任务之间可能会有一些延迟。

@AlKepp
并行。foreach
尝试为每个CPU核心运行单个任务。适用于cpu受限的任务。但是,如果您的任务与IO(web/DB/disk请求)更相关,并且大部分时间处于空闲状态,那么您可能希望启动更多的任务(而不是核心任务)。只是一个想法…@L.B如果您的工作是IO绑定的,而不是CPU绑定的,那么您首先不应该使用多个线程。不仅创建更多线程是不合适的,而且您甚至不应该创建尽可能多的内核。你不需要。创建(或从线程池中分配)大量线程只是为了让它们花费所有的时间无所事事,这是没有效率的;这只是浪费系统资源。@Servy再次阅读我的评论。我从来没有提到过“线程”,我使用了“task”@Servy
task.whalll(new[N]{httpClient.GetStringAsync()…})
不涉及线程,请阅读我在本文中的评论。。。启动100个web请求有什么问题?(忽略NW带宽和淹没服务器等)
 Parallel.ForEach(itemList, item => DoTasks(item, new Random().Next(15, 40)));
        Console.WriteLine("All Tasks Done!");