C# 带有QueueUserWorkItem的任务并行库

C# 带有QueueUserWorkItem的任务并行库,c#,.net,multithreading,task-parallel-library,threadpool,C#,.net,Multithreading,Task Parallel Library,Threadpool,我正在查找一些代码,其中我看到了以下代码: Parallel.ForEach(names, new ParallelOptions { TaskScheduler = { }, MaxDegreeOfParallelism = Environment.ProcessorCount }, x => { ThreadPool.QueueUserWorkItem(y => { Thread.Sleep(1000

我正在查找一些代码,其中我看到了以下代码:

Parallel.ForEach(names, new ParallelOptions { TaskScheduler = { }, MaxDegreeOfParallelism = Environment.ProcessorCount }, x =>
    {
        ThreadPool.QueueUserWorkItem(y =>
            {
                Thread.Sleep(1000);
                Console.WriteLine("Processing {0} on thread {1}", names[i++],
                               Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(1000);
            });
    });
我的问题是,在Parallel.ForEach中使用QueueUserWorkItem有什么优势吗?
对我来说,我们似乎在为每个元素创建两个线程,一个在ForEach中,另一个在QueueUserWorkItem中。

这段代码没有多大意义。
Paralell.ForEach
的主要特点是并行执行代码,等待直到所有代码完成执行。此代码违背了并行ForEach的目的。最好问问作者的意图是什么

这段代码的作用是,它在每次迭代中启动并行循环,将工作排队到
ThreadPool.QueueUserWorkItem
,并立即返回。它不会等到所有的工作都完成

您的代码并不比下面的代码好多少。几乎等于一个简单的foreach循环

foreach(var name in names)
{
    ThreadPool.QueueUserWorkItem(y =>
    {
        Thread.Sleep(1000);
        Console.WriteLine("Processing {0} on thread {1}", names[i++],
        Thread.CurrentThread.ManagedThreadId);
        Thread.Sleep(1000);
    });
});

我希望这有帮助。

不,这没有意义。这将使
并行。ForEach
在操作完成之前返回,这可能是/可能不是预期的。你为什么要写这样的代码?当您使用
TPL
时,我看不出有任何理由使用
ThreadPool.QueueUserWorkItem
。顺便说一句,你不必为每个元素创建两个线程。我没有编写代码,它是由这个项目中的其他人编写的。这就是为什么我在这里问这个问题。我做了一个小测试,发现在这个例子中Parallel.ForEach没有效果。如果一个客户端向服务发送6个作业,并且服务拾取这6个作业,然后如果另一个客户端向服务发送其他X个任务,则服务将无法在最后一个客户端的X个任务中工作,直到它完成第一个客户端的6个作业。我说的对吗?不清楚你的工作和服务是什么。简单地说:如果您希望
Paralell.ForEach
等待
ThreadPool.QueueUserWorkItem
中的所有代码,那么这里不会发生这种情况
Paralell.ForEach
这简直是浪费。它调用
ThreadPool.QueueUserWorkItem
,并在代码完成执行之前返回。这太完美了。我怎样才能做出你的回答?