ThreadPool.QueueUserWorkItem和Parallel.ForEach之间的区别?
以下两种方法之间的主要区别是什么:
ThreadPool.QueueUserWorkItem
Clients objClient = new Clients(); List objClientList = Clients.GetClientList(); foreach (var list in objClientList) { ThreadPool.QueueUserWorkItem(new WaitCallback(SendFilesToClient), list); }
System.Threading.Tasks.Parallel ForEach
Clients objClient = new Clients(); List objClientList = Clients.GetClientList(); Parallel.ForEach(objClientList, list => { SendFilesToClient(list); });
我是multithreading的新手,想知道每种情况下会发生什么(在执行过程方面)每种方法的multithreading水平是多少? 帮助我想象这两个过程。
SendFilesToClient:从数据库获取数据,转换为Excel并将Excel文件发送到相应的客户端。
谢谢!
主要区别在于function性。 Parallel.ForEach
将阻塞(按设计),因此在处理完所有对象之前它不会返回。 你的foreach
排队线程池线程工作会将工作推送到后台线程,而不是阻塞。
此外, Parallel.ForEach
版本还有另一个主要优点 – 未处理的exception将被推回到调用站点,而不是在ThreadPool线程上未处理。
通常, Parallel.ForEach
将更有效。 这两个选项都使用ThreadPool,但Parallel.ForEach
执行智能分区以防止过度读取并减少调度程序所需的开销量。 单个任务(将映射到ThreadPool线程)被重用,并有效地“合并”以降低开销,特别是如果SendFilesToClient
是一个快速操作(在这种情况下,不会是真的)。
请注意,作为第三种选择,您还可以使用PLINQ:
objClientList.AsParallel().ForAll(SendFilesToClient);
这在性能和function方面与Parallel.ForEach
方法非常相似。