1

C#で次のことをする慣用句と最速の方法は何ですか?複数の値を並列に計算します。すべてのスレッドが完了するのを待つ

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

asyncを使用できる場合は、WaitAll/WhenAllメソッドがこれを行う最もクリーンな方法になります。 http://stackoverflow.com/questions/25009437/running-multiple-async-tasks-and-waiting-for-them-all-to-complete –

答えて

3

あなたが完了するために、すべてのタスクを待つTask.WaitAllメソッドを使用することができます。私は3つの値(前3つのタスクを割り当てることはOKですので、それは常に三つの値である)を持つクラスを持っていると言います。あなたのケースへの簡単な解決方法を以下に示します。

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は、すべてのタスクが完了するのを待つために使用することもできます。 ComputeAComputeB、およびComputeCが非同期ではありません(と、彼らは代わりにTask<double>doubleを返すので、彼らはあなたのコードではありません)

+0

ありがとうございます。タスクtaskA = Task.Factory.StartNew(()=> av.A = "私はいつもそれらを静的に割り当てることができると思います。) – Ivan

2

場合、あなたは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がタスクの1つに呼び出しスレッドを再利用できるためです。

+0

私はどちらが速いのかを見極めるつもりです。 – Ivan

関連する問題