具有QueueUserWorkItem的任务并行库

本文关键字:并行 任务 QueueUserWorkItem 具有 | 更新日期: 2023-09-27 18:01:13

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

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中使用QueueUserWorkItem有什么优势吗。ForEach?对我来说,我们似乎为每个元素创建了2个线程,一个在ForEach中,另一个在QueueUserWorkItem中。

具有QueueUserWorkItem的任务并行库

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

这段代码的作用是,它在每次迭代中启动paracell循环,将工作排队到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);
    });
});

我希望这能有所帮助。