使用Task.WhenAll执行任务后,如何访问各任务的调用参数?
解决方法
核心思路是把任务和对应的调用参数绑定在一起存储,而不是只单独保存Task对象。这样后续遍历的时候就能直接拿到每个任务对应的参数,完全不用修改原有服务的返回结构。
具体可以用C#的元组来实现,直观又简洁:
修改你的代码如下:
// 改成保存「参数+任务」的配对列表,替代原来只存Task的列表 var taskWithParams = new List<(YourParamType Param, Task<List<myclass>> Task)>(); foreach (var item in list) { // 将参数item和对应的任务一起加入列表 taskWithParams.Add((item, _someservice.getsome(item))); } // 提取所有任务执行Task.WhenAll var tasks = taskWithParams.Select(t => t.Task).ToArray(); var taskResults = await Task.WhenAll(tasks); List<databaseclass> to_be_saved = new List<databaseclass>(); // 遍历配对列表,同时获取参数和任务结果 foreach (var pair in taskWithParams) { // pair.Param 就是当前任务的调用参数 var param = pair.Param; // 因为已经通过WhenAll完成了所有任务,这里await会立即返回结果 var result = await pair.Task; // 用param和result初始化databaseclass to_be_saved.Add(new databaseclass { // 示例:根据实际字段填充 // ParamRelatedField = param.SomeProperty, // ResultRelatedField = result.FirstOrDefault()?.Data }); }
补充说明
- 把
YourParamType替换成你实际的参数类型(也就是list集合里元素的类型) - 如果不习惯用元组,也可以自定义一个简单类来存参数和任务:
public class TaskWithParam { public YourParamType Param { get; set; } public Task<List<myclass>> Task { get; set; } }
然后用List<TaskWithParam>存储,用法和元组完全一致。
内容的提问来源于stack exchange,提问作者yunus emre kaya
相关产品推荐
相关产品推荐

