[英]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.