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

C# 12中如何用异步函数并行过滤集合?

问题解答

方案2的核心结论

  • 方案2默认不支持并行执行:ToAsyncEnumerable()转换后的异步枚举器,是按顺序逐个处理元素的——必须等前一个元素的CheckStateAsync执行完成,才会触发下一个元素的检查,无法实现所有过滤操作并行执行。
  • 方案2不是当前需求下的最优解:它的设计初衷是异步流式处理(比如处理海量数据时逐批加载、降低内存压力),但对于“所有元素并行过滤”的需求来说,写法既不简洁,也达不到并行效果。

更简洁的并行实现方案

可以简化方案1的写法,去掉冗余的ContinueWith(异步代码里尽量避免使用ContinueWith,直接用async lambda更清晰易读):

async Task Work()
{
    HashSet<string> myStrings = GetStrings();
    // 为每个元素创建异步检查任务,同时保留原元素
    var checkTasks = myStrings.Select(async s => 
        new { Value = s, ShouldKeep = await CheckStateAsync(s) != State.No });
    // 等待所有检查任务并行完成
    var checkResults = await Task.WhenAll(checkTasks);
    // 过滤出需要保留的元素
    var result = checkResults.Where(r => r.ShouldKeep).Select(r => r.Value).ToArray();
}

这个写法和方案1一样能实现全并行过滤,且代码更简洁,是当前需求下的最优选择。

内容的提问来源于stack exchange,提问作者Kjell Rilbe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 09:06:06