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
相关产品推荐
相关产品推荐

