具有QueueUserWorkItem的任务并行库

时间:2014-04-30 15:40:04

标签: c# .net multithreading task-parallel-library threadpool

我正在查看代码,我看到了这段代码:

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有什么好处吗? 对我来说,看起来我们每个元素创建2个线程,一个在ForEach中,另一个在QueueUserWorkItem中。

1 个答案:

答案 0 :(得分:2)

这段代码没有多大意义。 Paralell.ForEach的主要特征是它以并行和等待执行代码,直到所有代码完成执行。此代码违背了Paralell.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);
    });
});

我希望这会有所帮助。

相关问题