我正在查找一些代码,其中我看到了以下代码:
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中。
这段代码没有多大意义。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);
});
});
我希望这能有所帮助。