ThreadPool.QueueUserWorkItem和Parallel.ForEach之间的区别

2019-08-17 05:14发布

两个以下方法之间的主要区别是什么:

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.Parallel的ForEach

    Clients objClient = new Clients();
    List<Clients> objClientList = Clients.GetClientList();

    Parallel.ForEach<Clients>(objClientList, list =>
    {
        SendFilesToClient(list);
    });

我是新来的多线程,想知道发生了什么事情发生在每种情况下(在执行过程方面)什么是多线程每种方法的水平? 帮我既可视化的过程。

SendFilesToClient:从数据库中获取数据,转换成Excel和Excel文件发送给相应的客户端。

谢谢!

Answer 1:

主要的区别是功能性的。 Parallel.ForEach将阻止(设计),所以它不会返回,直到所有的对象都已经被处理。 你foreach排队线程池线程的工作将推动工作到后台线程,而不是阻止。

此外, Parallel.ForEach版本将有另一大优势-未处理的异常将被推迟到调用点这里,而不是在一个线程池线程离开未处理。

在一般情况下, Parallel.ForEach会更有效率。 这两种方法都使用线程池,但Parallel.ForEach做智能分区,以防止overthreading并减少开销由调度所需要的量。 个人任务(这将映射到线程池线程)得到重用,并有效地“集中”,以较低的开销,特别是如果SendFilesToClient是一个快速的操作(在这种情况下,不会是真的)。

请注意,您还可以,作为第三个选项,请使用PLINQ:

objClientList.AsParallel().ForAll(SendFilesToClient);

这将是非常相似的Parallel.ForEach方法在性能和功能方面。



文章来源: Difference between ThreadPool.QueueUserWorkItem and Parallel.ForEach?