You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 06:51:02