ThreadPool的区别.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);
    } 

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方法非常相似。

相关内容

  • 没有找到相关文章

最新更新