[英]Compute several values in parallel. Wait for all threads to finish
在C#中执行以下操作的惯用且最快的方法是什么? 假设我有一个包含三个值的类(它总是三个值,所以可以预分配3个任务是可以的):
public class AggregateValues
{
public double A { get; set;}
public double B { get; set;}
public double C { get; set;}
}
public AggregateValues Compute()
{
//How do I parallize these?
AggregateValues av = new AggregateValues();
av.A = ComputeA();
av.B = ComputeB();
av.C = ComputeC();
//Wait for ComputeA, ComputeB, ComputeC to be done
return av;
}
public double ComputeA()
{
// Complicated code
}
public double ComputeB()
{
// Complicated code
}
public double ComputeC()
{
// Complicated code
}
您可以使用Task.WaitAll方法来等待所有任务完成。 下面提供了针对您案件的简单解决方案。
public AggregateValues Compute()
{
//How do I parallize these?
AggregateValues av = new AggregateValues();
Task taskA = Task.Factory.StartNew(() => av.A = ComputeA());
Task taskB = Task.Factory.StartNew(() => av.B = ComputeB());
Task taskC = Task.Factory.StartNew(() => av.C = ComputeC());
//Wait for ComputeA, ComputeB, ComputeC to be done
Task.WaitAll(taskA, taskB, taskC);
return av;
}
在Task.WhenAll上等待也可以用于等待所有任务完成。
如果ComputeA
, ComputeB
和ComputeC
不是异步的(并且它们不在您的代码中,因为它们返回double
而不是Task<double>
),那么您可以使用Parallel.Invoke :
public AggregateValues Compute()
{
AggregateValues av = new AggregateValues();
Parallel.Invoke(
() => { av.A = ComputeA(); },
() => { av.B = ComputeB(); },
() => { av.C = ComputeC(); });
return av;
}
在您的方案中,Parallel.Invoke优于Task.WaitAll或Task.WhenAll,因为Parallel.Invoke可以将调用线程重用于其中一个任务。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.