1

在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 
} 
+1

如果你可以使用异步,WaitAll/WhenAll方法将是最干净的方法。 http://stackoverflow.com/questions/25009437/running-multiple-async-tasks-and-waiting-for-them-all-to-complete –

回答

3

你可以使用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也可用于等待所有任务完成。

+0

谢谢你的作品。我想知道如何有效“任务taskA = Task.Factory.StartNew(()=> av.A =”我想我总是可以静态分配它们 – Ivan

2

如果ComputeAComputeB,并且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.WaitAllTask.WhenAll,因为Parallel.Invoke可以重用其中一个任务的调用线程。

+0

我会时间看看哪一个更快。 – Ivan