如何使用Task.WhenAll运行返回不同数据类型的任务列表
解决不同返回类型异步方法并行执行并获取结果的问题
你不用把任务放到List<Task>里,直接单独保存每个具体类型的Task实例就行,这样等待完成后就能直接拿到返回值:
// 先启动两个异步任务,此时它们已经开始并行执行 var taskTa1 = Ta1(); var taskTa2 = Ta2(); // 等待两个任务都完成 await Task.WhenAll(taskTa1, taskTa2); // 直接获取结果,因为任务已经完成,这里不会阻塞 var a1 = taskTa1.Result; var a2 = taskTa2.Result; // 或者也可以用await,效果一样,因为任务已经处于完成状态 // var a1 = await taskTa1; // var a2 = await taskTa2;
如果非要用集合类管理任务,也可以用ValueTuple来存储不同类型的Task,再统一等待:
var tasks = (Ta1(), Ta2()); await Task.WhenAll(tasks.Item1, tasks.Item2); var a1 = tasks.Item1.Result; var a2 = tasks.Item2.Result;
为什么原来的写法拿不到返回值?
因为List<Task>里存的是基类Task,而只有泛型的Task<TResult>才带有Result属性(或可通过await获取具体类型结果)。把Task<int>和Task<string>转成Task后,就丢失了具体的类型信息,自然没法直接获取各自的返回值。
内容的提问来源于stack exchange,提问作者Emil Abbas
相关产品推荐
相关产品推荐

