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

