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