C# 带有QueueUserWorkItem的任务并行库
我正在查找一些代码,其中我看到了以下代码:C# 带有QueueUserWorkItem的任务并行库,c#,.net,multithreading,task-parallel-library,threadpool,C#,.net,Multithreading,Task Parallel Library,Threadpool,我正在查找一些代码,其中我看到了以下代码: Parallel.ForEach(names, new ParallelOptions { TaskScheduler = { }, MaxDegreeOfParallelism = Environment.ProcessorCount }, x => { ThreadPool.QueueUserWorkItem(y => { Thread.Sleep(1000
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有什么优势吗?
对我来说,我们似乎在为每个元素创建两个线程,一个在ForEach中,另一个在QueueUserWorkItem中。这段代码没有多大意义。
Paralell.ForEach
的主要特点是并行执行代码,等待直到所有代码完成执行。此代码违背了并行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);
});
});
我希望这有帮助。不,这没有意义。这将使
并行。ForEach
在操作完成之前返回,这可能是/可能不是预期的。你为什么要写这样的代码?当您使用TPL
时,我看不出有任何理由使用ThreadPool.QueueUserWorkItem
。顺便说一句,你不必为每个元素创建两个线程。我没有编写代码,它是由这个项目中的其他人编写的。这就是为什么我在这里问这个问题。我做了一个小测试,发现在这个例子中Parallel.ForEach没有效果。如果一个客户端向服务发送6个作业,并且服务拾取这6个作业,然后如果另一个客户端向服务发送其他X个任务,则服务将无法在最后一个客户端的X个任务中工作,直到它完成第一个客户端的6个作业。我说的对吗?不清楚你的工作和服务是什么。简单地说:如果您希望Paralell.ForEach
等待ThreadPool.QueueUserWorkItem
中的所有代码,那么这里不会发生这种情况Paralell.ForEach
这简直是浪费。它调用ThreadPool.QueueUserWorkItem
,并在代码完成执行之前返回。这太完美了。我怎样才能做出你的回答?