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

IEnumerable查询搭配ContinueWith的执行完成顺序是否有保障?

结论

你无法保证ContinueWith()的执行顺序和源数组的顺序一致,必须使用outArray[index] = result的方式保存结果,绝对不能直接用outArray.append(result)。

原因说明

你代码中调用的FirstOrDefaultAsync()是访问远程数据库的IO型异步操作,每个请求的响应耗时完全不受发起顺序控制:可能索引更靠后的请求因为网络抖动更小、数据库查询命中缓存等原因更早返回,对应的ContinueWith()回调就会优先执行。
比如源数组有3个元素,你按索引0、1、2的顺序发起请求,最终可能索引1的请求先拿到结果,先触发对应的ContinueWith()。如果此时用append存结果,索引1的结果就会被存到输出数组的第0位,最终输出顺序完全错乱。

额外注意事项

  • 你当前的写法只生成了异步任务集合,没有做统一等待逻辑,如果在所有任务完成前就访问outArray,会拿到不完整的结果,建议用Task.WhenAll()包裹所有生成的任务,等待全部完成后再使用输出数组。
  • 除非你明确需要ContinueWith()的调度配置,否则更推荐用async/await写法代替ContinueWith(),可读性更高,也更容易规避异步回调带来的顺序、上下文调度类问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:24:03