Lea*_*ner 22 c# multithreading windows-services queueuserworkitem parallel.foreach
以下两种方法之间的主要区别是什么:
ThreadPool.QueueUserWorkItem
Clients objClient = new Clients();
List<Clients> objClientList = Clients.GetClientList();
foreach (var list in objClientList)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(SendFilesToClient), list);
}
Run Code Online (Sandbox Code Playgroud)
System.Threading.Tasks.Parallel ForEach
Clients objClient = new Clients();
List<Clients> objClientList = Clients.GetClientList();
Parallel.ForEach<Clients>(objClientList, list =>
{
SendFilesToClient(list);
});
Run Code Online (Sandbox Code Playgroud)
我是多线程新手,想知道在每种情况下会发生什么(在执行过程方面)每种方法的多线程水平是多少?帮助我想象这两个过程.
SendFilesToClient:从数据库获取数据,转换为Excel并将Excel文件发送到相应的客户端.
谢谢!
Ree*_*sey 22
主要区别在于功能性. Parallel.ForEach
将阻止(按设计),因此在处理完所有对象之前不会返回.您的foreach
排队线程池线程工作将工作推送到后台线程,而不是阻止.
此外,该Parallel.ForEach
版本还有另一个主要优点 - 未处理的异常将被推回到调用站点,而不是在ThreadPool线程上未处理.
一般来说,Parallel.ForEach
效率会更高.这两个选项都使用ThreadPool,但进行Parallel.ForEach
智能分区以防止过度读取并减少调度程序所需的开销量.单个任务(将映射到ThreadPool线程)被重用,并有效地"合并"以降低开销,特别是如果SendFilesToClient
是快速操作(在这种情况下,将不是真的).
请注意,作为第三种选择,您还可以使用PLINQ:
objClientList.AsParallel().ForAll(SendFilesToClient);
Run Code Online (Sandbox Code Playgroud)
这Parallel.ForEach
在性能和功能方面与方法非常相似.
归档时间: |
|
查看次数: |
6614 次 |
最近记录: |