如何使用Task.WhenAll并行执行两个独立的计算任务?
并行计算需求实现方案
问题原因
你之前的代码无法编译核心有三个问题:
- 方法名冲突:新定义的异步方法和原有计算方法同名
Evaluate,编译器无法匹配调用逻辑 - 类型不兼容:原有
Evaluate是同步方法返回int,不能直接赋值给Task类型变量 - 未使用泛型任务:带返回值的异步任务需要用
Task<T>泛型类型才能读取返回结果
代码实现
方案1:async/await异步实现(通用场景,支持IO/CPU密集型计算)
这种写法不阻塞当前调用线程,适合桌面、Web等需要保持响应的场景:
// 异步计算方法,返回最终计算结果 public async Task<int> CalculateAsync() { int a1 = 1; int a2 = 2; int b1 = 3; int b2 = 4; int c3 = 5; int c4 = 6; int c5 = 7; int c6 = 8; int c7 = 9; // 包装同步计算为异步任务,启动并行执行 Task<int> rank1Task = Task.Run(() => Evaluate(a1, a2, c3, c4, c5, c6, c7)); Task<int> rank2Task = Task.Run(() => Evaluate(b1, b2, c3, c4, c5, c6, c7)); // 等待两个任务全部执行完成 await Task.WhenAll(rank1Task, rank2Task); // 读取任务返回值 int rank1 = rank1Task.Result; int rank2 = rank2Task.Result; return EvaluateOutcome(rank1, rank2); } // 原有计算方法无需修改 public static int Evaluate(int i1, int i2, int i3, int i4, int i5, int i6, int i7) { Random rand = new Random(); return rand.Next(0,10); } public static int EvaluateOutcome(int rank1, int rank2) { return rank1 * rank2; }
调用方式示例:int result = await CalculateAsync();
方案2:Parallel同步并行实现(纯CPU密集型计算场景)
如果是后台纯计算场景,不需要保持调用线程响应,可以用更简单的并行调用:
public int Calculate() { int a1 = 1; int a2 = 2; int b1 = 3; int b2 = 4; int c3 = 5; int c4 = 6; int c5 = 7; int c6 = 8; int c7 = 9; int rank1 = 0; int rank2 = 0; // 并行执行两个计算,会阻塞到所有计算完成 Parallel.Invoke( () => rank1 = Evaluate(a1, a2, c3, c4, c5, c6, c7), () => rank2 = Evaluate(b1, b2, c3, c4, c5, c6, c7) ); return EvaluateOutcome(rank1, rank2); }
内容的提问来源于stack exchange,提问作者Steve W
相关产品推荐
相关产品推荐

