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”@Servytask.whalll(new[N]{httpClient.GetStringAsync()…})
不涉及线程,请阅读我在本文中的评论。。。启动100个web请求有什么问题?(忽略NW带宽和淹没服务器等)
Parallel.ForEach(itemList, item => DoTasks(item, new Random().Next(15, 40)));
Console.WriteLine("All Tasks Done!");