有什么区别:
Parallel.ForEach(sometasks, x => x.Wait());
和
Task.WaitAll(sometasks);
修改
嗯,我不完全确定为什么我将Parallel纳入问题:/ ...我的想法是:
foreach(Task task in someTasks)
{
task.Wait();
}
但我刚刚将Parallel.ForEach包含在内,认为它是同一个东西,当然它不是 - 它为每个任务等待产生一个线程,这是一个很大的开销。
答案 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
是为基于任务的并行性而设计的 - 帮助您构建复杂的异步执行,并可以处理任务依赖性,失败等。