并行评估方法
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());
我想侵入性最小的方法是使用 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 操作的并行度不是必需的。
假设我需要以下独立方法的输出
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());
我想侵入性最小的方法是使用 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 操作的并行度不是必需的。