繁体   English   中英

C#TPL如何知道所有任务都完成了?

[英]C# TPL how to know that all tasks are done?

我有Loop生成任务。

码:

Task task = null;
foreach (Entity a in AAAA)
{
  // create the task 
  task = new Task(() => {
    myMethod(a);
  },  Token, TaskCreationOptions.None);
  task.Start();
}

正如你在每次迭代中看到的那样,任务对象有了新的初始化(.. new Task(()=> ..)我怎么知道所有的任务都完成了?

我用一个替换它

 Parallel.ForEach(...,  () => myMethod(a), ...)

然后,您将在ForEach结束时自动等待所有任务。

也许可以从一个单独的Task运行ForEach。

var allTasks = new List&ltTask>();
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());

您需要保留对循环中创建的所有任务的引用。 然后,您可以使用Task.WaitAll方法(请参阅MSDN参考 )。 您可以创建一个数组并将任务分配给该数组的元素(在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可能是一个更好的选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM