Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 并行计算多个值。等待所有线程完成_C#_Multithreading_Parallel Processing_Task Parallel Library - Fatal编程技术网

C# 并行计算多个值。等待所有线程完成

C# 并行计算多个值。等待所有线程完成,c#,multithreading,parallel-processing,task-parallel-library,C#,Multithreading,Parallel Processing,Task Parallel Library,在C#中执行以下操作的惯用且最快的方法是什么?假设我有一个类有三个值(它总是三个值,所以预先分配三个任务是可以的): 您可以使用方法等待所有任务完成。下面为您的案例提供了一个简单的解决方案 public AggregateValues Compute() { //How do I parallize these? AggregateValues av = new AggregateValues(); Task taskA = Task.Factory.StartNew(

在C#中执行以下操作的惯用且最快的方法是什么?假设我有一个类有三个值(它总是三个值,所以预先分配三个任务是可以的):

您可以使用方法等待所有任务完成。下面为您的案例提供了一个简单的解决方案

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;
}
wait on还可用于等待所有任务完成。

您可以使用方法等待所有任务完成。下面为您的案例提供了一个简单的解决方案

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;
}

wait on还可用于等待所有任务完成。

如果
ComputeA
ComputeB
ComputeC
不是异步的(它们不在您的代码中,因为它们返回的是
double
而不是
Task
),则可以使用:


在您的场景中,Parallel.Invoke略优于Parallel.Invoke,因为Parallel.Invoke可以为其中一个任务重用调用线程。

如果
ComputeA
ComputeB
ComputeC
不是异步的(它们不在您的代码中,因为它们返回
double
而不是
Task
),然后您可以使用:


在您的场景中,Parallel.Invoke略优于Parallel.Invoke,因为Parallel.Invoke可以为其中一个任务重用调用线程。

如果可以使用异步,WaitAll/WhenAll方法将是最干净的方法。如果可以使用异步,WaitAll/WhenAll方法将是最干净的方法。谢谢,这很有效。我想知道“Task taskA=Task.Factory.StartNew(()=>av.A=”我想我总是可以静态分配它们。谢谢你这么做。我想知道“Task taskA=Task.Factory.StartNew(()=>av.A=”的效率有多高我想我总是可以静态地分配它们。我要花时间看看哪一个更快。我要花时间看看哪一个更快。
public AggregateValues Compute()
{
    AggregateValues av = new AggregateValues();
    Parallel.Invoke(
        () => { av.A = ComputeA(); },
        () => { av.B = ComputeB(); },
        () => { av.C = ComputeC(); });
    return av;
}