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

本文关键字:问题 StartNew Task Factory 关于 | 更新日期: 2023-09-27 18:13:28

我是一个使用线程的初学者。我在看一堆代码。我相信它应该在零件列表中的每个零件的单个线程中运行方法。以下是代码(a):

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

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

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

哪个代码块在单独的线程中运行方法?和/或应该做出哪些改变来完成任务?

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

你对StartNew()工作原理的理解是正确的。

根据文件…StartNew()接受一个操作,它将为该操作创建一个任务并在该任务中运行该操作。

这是异步发生的,所以你的调用代码继续执行。然而,你传递给StartNew()的动作同步执行,所以在第一个代码块你的整个循环将在同一线程内运行。如果您想要实现的只是让循环与主代码异步运行,那么这可能是您想要的行为。如果你想通过多线程来提高性能,那么第二个代码块就是你想要的。

编辑:正如EZI提到的Parallel.ForeEach在这里可能更好…代码应该是这样的:

    Parallel.ForEach(partlist, DoLotsOfWork);

Parallel.Foreach更有效,因为它将批处理,而不是为列表中的每个项目创建线程,但它也不会像StartNew那样异步运行。

如果你想让Parrallel.Foreach异步运行,你可以这样做…

Task.Factory.StartNew(() => Parallel.ForEach(partlist, DoLotsOfWork));