关于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));
}
哪个代码块在单独的线程中运行方法?和/或应该做出哪些改变来完成任务?
你对StartNew()
工作原理的理解是正确的。
根据文件…StartNew()
接受一个操作,它将为该操作创建一个任务并在该任务中运行该操作。
这是异步发生的,所以你的调用代码继续执行。然而,你传递给StartNew()
的动作同步执行,所以在第一个代码块你的整个循环将在同一线程内运行。如果您想要实现的只是让循环与主代码异步运行,那么这可能是您想要的行为。如果你想通过多线程来提高性能,那么第二个代码块就是你想要的。
编辑:正如EZI提到的Parallel.ForeEach
在这里可能更好…代码应该是这样的:
Parallel.ForEach(partlist, DoLotsOfWork);
Parallel.Foreach
更有效,因为它将批处理,而不是为列表中的每个项目创建线程,但它也不会像StartNew
那样异步运行。
如果你想让Parrallel.Foreach
异步运行,你可以这样做…
Task.Factory.StartNew(() => Parallel.ForEach(partlist, DoLotsOfWork));