我正在查看代码,我看到了这段代码:
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中。
答案 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);
});
});
我希望这会有所帮助。