关于Task.Factory.StartNew的基本问题

时间:2014-07-17 21:38:29

标签: c# multithreading

我是处理线程的初学者。我在看一块Code。我相信它应该在零件清单中的每个零件的单个螺纹中运行一个方法。这是守则(a):

    Task.Factory.StartNew(()=>
      foreach (string part in partlist)
      {
        DoLotsOfStuff(part);
      }
    );

对我来说,看起来它会在一个线程中运行所有这些。如果它应该在各个线程中运行该方法,我希望代码看起来像这样。这是守则(b);

    foreach (string part in partlist)
    {
      Task.Factory.StartNew(()=> DoLotsOfStuff(part));
    }

哪个代码块在各个线程中运行该方法?和/或应该做些什么改变才能完成任务?

1 个答案:

答案 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));