Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#TPL如何知道所有任务都已完成?_C#_Task_Task Parallel Library - Fatal编程技术网

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());