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
相关产品推荐
相关产品推荐

