C# 并行计算多个值。等待所有线程完成
在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(
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;
}