C#TPL如何知道所有任务都已完成?
我有一个生成任务的循环 代码: 正如您在每个迭代中看到的,任务对象有新的初始化(…新任务(()=>)C#TPL如何知道所有任务都已完成?,c#,task,task-parallel-library,C#,Task,Task Parallel Library,我有一个生成任务的循环 代码: 正如您在每个迭代中看到的,任务对象有新的初始化(…新任务(()=>) 如何知道所有任务都已完成?您需要保留对循环中创建的所有任务的引用。然后您可以使用Task.WaitAll方法(请参阅)。您可以创建一个数组并将任务分配给数组的元素(在C#2.0中),也可以使用LINQ: var tasks = AAAA.Select((Entity a) => Task.Factory.StartNew(() => { myMethod(a);
如何知道所有任务都已完成?您需要保留对循环中创建的所有任务的引用。然后您可以使用
Task.WaitAll
方法(请参阅)。您可以创建一个数组并将任务分配给数组的元素(在C#2.0中),也可以使用LINQ:
var tasks =
AAAA.Select((Entity a) =>
Task.Factory.StartNew(() => { myMethod(a); },
Token, TaskCreationOptions.None)).ToArray();
Task.WaitAll(tasks)
如果您不需要(明确地)使用任务,那么Henk建议使用
Parallel.ForEach
可能是一个更好的选择。I如果您用
Parallel.ForEach(..., () => myMethod(a), ...)
然后,在ForEach结束时,所有任务都会自动等待
还可以从一个单独的任务运行ForEach。整洁-我想你需要键入list
list
,这样.ToArray()
就可以生成一个任务数组,而不是反对它。希望我能投票几次。这毕竟是一个“不要重新发明轮子”的好例子问题是,在创建任务的循环和Parallel.ForEach之间存在一些非常真实的性能问题/差异。虽然它们在许多情况下可能相似,但不应该盲目地将它们相互替换以解决不相关的问题。@Andrew,你是对的。我只是因为不特定的“mymethod(a)”而对其视而不见`以及缺乏有关情况的信息。
var allTasks = new List<Task>();
foreach (Entity a in AAAA)
{
// create the task
task = new Task(() => {
myMethod(a);
}, Token, TaskCreationOptions.None);
// Add the tasks to a list
allTasks.Add(task);
task.Start();
}
// Wait until all tasks are completed.
Task.WaitAll(allTasks.ToArray());
var allTasks = new List<Task>();
foreach (Entity a in AAAA)
{
// create the task
task = new Task(() => {
myMethod(a);
}, Token, TaskCreationOptions.None);
// Add the tasks to a list
allTasks.Add(task);
task.Start();
}
// Wait until all tasks are completed.
Task.WaitAll(allTasks.ToArray());