并行评估方法

问题描述 投票:0回答:3

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

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

在不破坏逻辑可读性的情况下并行执行这些计算的代码侵入性最小的方法是什么?我知道

Parallel.Foreach()
但在这种情况下,没有要处理的项目列表,只有独立的方法调用。

c# parallel-processing parallelism-amdahl
3个回答
3
投票

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

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

1
投票

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

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


0
投票

使用

Task.Run
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 密集型操作的并行度。

© www.soinside.com 2019 - 2024. All rights reserved.