Web API中Parallel.ForEach操作List的线程安全问题咨询
代码运行时的问题与解决方案
这段代码存在严重的线程安全问题,必须使用并发集合,原因如下:
List<T>本身不是线程安全的集合,它的Add方法没有任何并发控制逻辑。当多个线程同时调用Add时,会触发竞态条件:- 多个线程可能同时修改内部的
Count变量,导致计数错误,最终集合里的元素数量少于预期; - 当List需要扩容(内部数组满了)时,并发操作可能导致数组引用混乱,甚至抛出
IndexOutOfRangeException; - 极端情况下,还会出现元素被覆盖、集合内部状态永久损坏的情况。
- 多个线程可能同时修改内部的
你提到的“不存在重复键问题”和List的线程安全是完全无关的两个问题——Dictionary的重复键是业务逻辑层面的冲突,而List的并发写入问题是集合内部状态的并发修改冲突,两者没有关联。
修正方案
改用.NET提供的线程安全集合,比如ConcurrentBag<T>(适合并行场景下的元素收集),示例代码如下:
var result = new ConcurrentBag<MyType>(); Parallel.ForEach(items, i => { // 执行数据库请求逻辑 var otherResult = ...; result.Add(otherResult); }); // 如果后续需要List<T>类型,直接转换即可 var finalResultList = result.ToList();
内容的提问来源于stack exchange,提问作者Love Coding
相关产品推荐
相关产品推荐

