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

C#异步编程:从Task变量获取异步方法返回值编译失败求助

问题原因与解决办法

你的代码编译失败的核心原因是:你声明的taskA/taskB/taskC是无泛型的Task类型,但MethodToBeCalledParallelly返回的是带返回值的Task<int>。非泛型Task仅表示一个异步操作的完成状态,不携带返回结果,所以await taskA无法得到int类型的值赋值给变量a。

修正方案1:指定正确的泛型Task类型

把变量声明改为Task<int>,这样await时就能获取到异步方法的返回值:

namespace CSharpThreading
{
    internal class Program
    {
        static async Task Main(string[] args)
        {
            // 改为Task<int>类型,匹配方法返回值
            Task<int> taskA = MethodToBeCalledParallelly(100);
            Task<int> taskB = MethodToBeCalledParallelly(200);
            Task<int> taskC = MethodToBeCalledParallelly(300);

            int a = await taskA;
            int b = await taskB;
            int c = await taskC;
            
            // 可以添加输出验证结果
            Console.WriteLine($"返回值:a={a}, b={b}, c={c}");
        }
   
        static async Task<int> MethodToBeCalledParallelly(int extraDelay)
        {
            int totalDelay = 3000 + extraDelay;

            await Task.Delay(totalDelay);
            Console.WriteLine("I was called parallelly");

            return totalDelay;
        }
    }
}

优化方案:使用Task.WhenAll批量等待任务

如果不需要逐个处理返回值,而是等所有任务完成后一次性获取结果,用Task.WhenAll会更简洁高效,还能避免不必要的逐个await:

static async Task Main(string[] args)
{
    Task<int> taskA = MethodToBeCalledParallelly(100);
    Task<int> taskB = MethodToBeCalledParallelly(200);
    Task<int> taskC = MethodToBeCalledParallelly(300);

    // 一次性等待所有任务完成,获取所有返回值数组
    int[] results = await Task.WhenAll(taskA, taskB, taskC);
    
    Console.WriteLine($"返回值:a={results[0]}, b={results[1]}, c={results[2]}");
}

关键知识点

  • Task:无返回值的异步操作,await后仅等待操作完成,无返回结果。
  • Task<TResult>:携带返回值的异步操作,await后会返回TResult类型的结果。
  • 你的异步方法返回Task<int>,必须用Task<int>类型的变量接收,才能通过await获取返回值。

内容的提问来源于stack exchange,提问作者Claor LandisGyr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 13:03:14