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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 17:19:58