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

如何向已有的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 08:40:47