间歇性出现System.InvalidOperationException枚举操作无法执行问题求助
错误根因
这个System.InvalidOperationException报错的核心原因是正在遍历的inputProfile.Emails集合在枚举过程中被其他线程修改,属于典型的非线程安全集合并发访问问题。
报错间歇性触发的特征完全匹配并发问题的表现:只有当遍历操作和集合修改操作的CPU时间片刚好重叠时才会抛出异常,低并发场景下大概率不会触发,因此才会出现每约50次调用才偶现一次的情况。
结合你提供的代码逻辑可以判断,当前遍历逻辑本身没有修改inputProfile.Emails集合,修改操作一定发生在其他复用了inputProfile对象的线程中:比如API响应解析逻辑、其他并行执行的业务逻辑,在你遍历集合的同时对Emails执行了新增/删除/元素修改操作。此外inputProfile是dynamic类型,运行时绑定的如果是List<T>这类默认非线程安全的集合,天然不支持多线程下同时遍历和修改。
修复方案
可按业务需求选择对应方案处理:
- 优先方案:遍历前对
inputProfile.Emails生成快照副本,用副本完成遍历操作,完全避免原集合修改对当前遍历的影响,代码改动极小:
// 遍历前调用ToList()生成独立快照,后续原集合修改不会影响当前遍历逻辑 foreach (var item in inputProfile.Emails.ToList())
- 兜底方案:如果业务要求必须遍历实时最新的集合数据,不能使用快照,则需要在所有访问
inputProfile.Emails的代码位置加锁,保证同一时间只有一个线程对集合执行修改或遍历操作。
内容的提问来源于stack exchange,提问作者cSharp
相关产品推荐
相关产品推荐

