Parallel.ForEach(task.Wait)和Task.WaitAll之间的区别

时间:2014-03-04 14:38:00

标签: c# .net multithreading task-parallel-library

有什么区别:

Parallel.ForEach(sometasks, x => x.Wait());

Task.WaitAll(sometasks);

修改

嗯,我不完全确定为什么我将Parallel纳入问题:/ ...我的想法是:

foreach(Task task in someTasks)
{
    task.Wait();
}

但我刚刚将Parallel.ForEach包含在内,认为它是同一个东西,当然它不是 - 它为每个任务等待产生一个线程,这是一个很大的开销。

3 个答案:

答案 0 :(得分:7)

虽然Parallel.ForEach(sometasks, x => x.Wait());对我毫无意义。

简短回答是

Parallel.ForEach: 使用您的代码,阻止至少两个线程。也调用线程和ThreadPool线程。

Task.WaitAll:仅阻止调用线程。

答案 1 :(得分:2)

循环中WaitAll()与调用Wait()之间的巨大差异是当一个或多个Task失败时:

  • WaitAll()将始终等待所有Task完成,即使其中一些失败。如果多个Task失败,则会抛出AggregateException,其中包含所有失败的Task的例外情况。
  • 一旦遇到第一个异常,循环中的
  • Wait()就会抛出。这意味着它可能不会等待所有Task完成,并且您也将只学习一个例外,即使有多个例外。

答案 2 :(得分:0)

Parallel类旨在提供简单有效的数据并行(您可以在不同数据上分发SAME任务,然后收集结果)。这些问题的典型例子是矢量或矩阵处理问题(矩阵乘法,图像处理等)。

Task是为基于任务的并行性而设计的 - 帮助您构建复杂的异步执行,并可以处理任务依赖性,失败等。