我是处理线程的初学者。我在看一块Code。我相信它应该在零件清单中的每个零件的单个螺纹中运行一个方法。这是守则(a):
Task.Factory.StartNew(()=>
foreach (string part in partlist)
{
DoLotsOfStuff(part);
}
);
对我来说,看起来它会在一个线程中运行所有这些。如果它应该在各个线程中运行该方法,我希望代码看起来像这样。这是守则(b);
foreach (string part in partlist)
{
Task.Factory.StartNew(()=> DoLotsOfStuff(part));
}
哪个代码块在各个线程中运行该方法?和/或应该做些什么改变才能完成任务?
答案 0 :(得分:1)
您对StartNew()
的工作原理的理解是正确的。
根据docs ... StartNew()
执行一项操作,它将为该任务创建任务并运行该操作。
这是异步发生的,因此您的调用代码会继续执行。但是,传递给StartNew()
的操作会同步执行,因此在第一个代码块中,整个循环将在同一个线程中运行。如果你想要实现的是让循环与主代码异步运行,那么这可能是理想的行为。如果你试图通过多线程处理在循环内完成的工作来获得性能提升,那么第二个代码块就是你想要的。
修改:因为EZI提到Parallel.ForeEach
可能会更好......代码看起来像这样......
Parallel.ForEach(partlist, DoLotsOfWork);
Parallel.Foreach
更有效率,因为它将批量处理而不是为列表中的每个项创建一个线程,但它也不会像StartNew
那样异步运行。
如果您希望Parrallel.Foreach
以异步方式运行,您可以随时执行此操作...
Task.Factory.StartNew(() => Parallel.ForEach(partlist, DoLotsOfWork));