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