繁体   English   中英

带有QueueUserWorkItem的任务并行库

[英]Task Parallel Library with QueueUserWorkItem

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

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中。

这段代码没有多大意义。 主要特点Paralell.ForEach是它执行使用并联,并等待 ,直到所有的代码完成执行的代码。 此代码Paralell.ForEach的目的。 最好问一下作者的意图。

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

我希望这有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM