如何向已有的Task<List<MyClass>>中添加非Task元素?
最优实现:将同步生成的MyClass实例加入Task<List>结果
核心思路
直接在任务完成后的结果列表中添加同步生成的实例即可,最优方式是使用async/await替代ContinueWith——它不仅代码更简洁易读,还能避免ContinueWith带来的调度器上下文问题。
修正后的完整代码
public async Task<List<MyClass>> CheckAsync(Input input) { // 同步逻辑生成nonTaskClass var nonTaskClass = new MyClass(); if (input.Form == 1 || input.Country == "Lithuania") // 修正原代码的赋值语法错误为判断逻辑 { nonTaskClass.Message = "Some message goes here"; } else { nonTaskClass.Message = "Another message"; } // 创建基于nonTaskClass的任务列表(示例占位逻辑) List<Task<SomeServiceResult>> tasks = GetTasksFromNonTaskClass(nonTaskClass); // 等待所有任务完成,转换结果并添加同步实例 var taskResults = await Task.WhenAll(tasks); var resultList = taskResults.Select(o => new MyClass { Message = o.Message }).ToList(); // 直接将同步生成的实例加入结果列表 resultList.Add(nonTaskClass); return resultList; }
为什么这是最优方案
- 可读性强:逻辑线性展开,没有嵌套回调,维护成本极低
- 安全可靠:
async/await自动处理上下文调度,避免ContinueWith默认调度器可能引发的线程问题 - 性能无损耗:同步实例直接加入列表,无需额外异步包装
兼容老版本.NET的备选方案(不推荐)
如果无法使用async/await,可以修改ContinueWith的回调逻辑直接添加实例:
public Task<List<MyClass>> CheckAsync(Input input) { var nonTaskClass = new MyClass(); if (input.Form == 1 || input.Country == "Lithuania") { nonTaskClass.Message = "Some message goes here"; } else { nonTaskClass.Message = "Another message"; } List<Task<SomeServiceResult>> tasks = GetTasksFromNonTaskClass(nonTaskClass); var x = Task.WhenAll(tasks).ContinueWith(t => { var list = t.Result.Select(o => new MyClass { Message = o.Message }).ToList(); // 在回调中插入同步生成的实例 list.Add(nonTaskClass); return list; }); return x; }
注意:该方式需注意ContinueWith的调度器参数(默认可能在非预期线程执行),稳定性不如async/await方案。
内容的提问来源于stack exchange,提问作者renathy
相关产品推荐
相关产品推荐

