簡體   English   中英

並行計算多個值。 等待所有線程完成

[英]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上等待也可以用於等待所有任務完成。

如果ComputeAComputeBComputeC不是異步的(並且它們不在您的代碼中,因為它們返回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可以將調用線程重用於其中一個任務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM