并行评估方法

Evaluating methods in parallel

假设我需要以下独立方法的输出

var x = LongCalculation(123)
var y = LongCalculation2(345)
var z = LongCalculation3(678)
var b = LongCalculation4(910)

在不破坏逻辑可读性的情况下,并行执行这些计算的代码侵入性最小的方法是什么?我知道 Parallel.Foreach() 但在这种情况下没有要处理的项目列表,只有独立的方法调用。

您可以从代码中列出要处理的项目:

int x,y,z,b;
List<Action> actions = new List<Action>
{
    () => x = LongCalculation(123),
    () => y = LongCalculation2(345),
    () => z = LongCalculation3(678),
    () => b = LongCalculation4(910)
};
Parallel.ForEach(actions, x => x.Invoke());

在线演示:https://dotnetfiddle.net/xy7sxF

我想侵入性最小的方法是使用 Parallel.Invoke:

long x, y, z, b;
Parallel.Invoke(
    () => x = LongCalculation(123),
    () => y = LongCalculation2(345),
    () => z = LongCalculation3(678),
    () => b = LongCalculation4(910)
);

使用 Task.Run and the Task.WaitAll 应该非常易读:

var task1 = Task.Run(() => LongCalculation(123));
var task2 = Task.Run(() => LongCalculation2(345));
var task3 = Task.Run(() => LongCalculation3(678));
var task4 = Task.Run(() => LongCalculation4(910));
Task.WaitAll(task1, task2, task3, task4);
var x = task1.Result;
var y = task2.Result;
var z = task3.Result;
var b = task4.Result;

这假设限制 CPU-bound 操作的并行度不是必需的。