我有一个返回System.Threading.Tasks.Task
的对象:
public class MyClass
{
public Task GetTask(object state, CancellationToken cancellationToken)
{
return new Task(Execute, state, cancellationToken);
}
public void Execute(object context)
{
//do stuff
}
}
在其他地方我有List<MyClass>
,所以我执行以下操作以获得List<Task>
:
var myTaskList = myClassList.Select(p => p.GetTask(null, cancellationToken)).ToList();
既然我有List<Task>
,我怎么能并行启动它们?是否有更简洁的方法对此进行编码?
谢谢!
答案 0 :(得分:26)
“并行启动”是什么意思?当你运行Task
时,它会在另一个线程上执行,所以你可能只是简单地说:
foreach(var task in myTaskList)
{
task.Start();
}
但是如果你有这么多的想要将起始逻辑移动到另一个线程,你可以在另一个线程/任务中调用上面的代码(我使用List<T>.ForEach
来获得更短的代码)。
Task.Factory.StartNew(() => myTaskList.ForEach(task => task.Start()));
或者你可以使用TPL的Parallel.ForEach
。这仍将阻止执行线程,直到所有任务都启动,但它将在内部线程池上执行启动操作,因此对于大量项目和一些空闲CPU核心/线程,它可能会大大加快启动速度。
Parallel.ForEach(myTaskList, task => task.Start());
答案 1 :(得分:6)
我可能误解了你的问题,但这不仅仅是在每项任务上调用Start吗?
foreach(Task task in myTaskList)
{
task.Start();
}
等待所有任务完成:
Task.WaitAll(myTaskList.ToArray());