错误信息:     集合已修改;可能无法执行枚举操作

调用堆栈:

在 System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)

在 System.Collections.Generic.Dictionary`2.Enumerator.MoveNext()

这个错误是怎么引发的?

我们具体分析一下Dictionary的内部实现。

public class Dictionary<TKey, TValue>

{

//字典的版本号

private int version;

public void Clear()

{

//执行这个操作后,版本号加一,版本发生变化

this.version++;

}

private void Insert(TKey key, TValue value, bool add)

{

//执行这个操作后,版本号加一,版本发生变化

this.version++;

}

public bool Remove(TKey key)

{

//执行这个操作后,版本号加一,版本发生变化

this.version++;

}

public void Add(TKey key, TValue value)

{

//执行这个操作后,版本号加一,版本发生变化

this.Insert(key, value, true);

}

public struct Enumerator

{

private Dictionary<TKey, TValue> dictionary;

//Enumerator的版本号

private int version;

internal Enumerator(Dictionary<TKey, TValue> dictionary)

{

this.dictionary = dictionary;

//初始化时,把当时dictionary.version传给Enumerator的version

this.version = dictionary.version;

}

public bool MoveNext()

{

//如果dictionary.version发生变化,就会抛出上面的异常

if (this.version != this.dictionary.version)

                {

                    ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);

                }

}

}

通过分析源码可以知道,只要dictionary.version发生变化,在做foreach循环时,就会抛出上面的错误。

具体来说,在做foreach循环时,dictionary对象发生了Clear、Insert、Remove、Add操作时,就会引发上面的异常。

如果代码场景涉及到并发操作,推荐用并发字典ConcurrentDictionary,不要自己加锁控制并发。

转载于:https://www.cnblogs.com/50614090/p/9728750.html

错误信息: 集合已修改;可能无法执行枚举操作。相关推荐

  1. c#“集合已修改;可能无法执行枚举操作”

    list中用了remove操作,结果报这个错误. 使用foreach不能执行删除.修改,这是规定.你可以使用for循环遍历修改. 如果你是删除的话,for循环 i 要从大到小,比如: for(int  ...

  2. 怎么回事儿?C#错误:集合已修改;枚举操作可能无法执行。

    本意是遍历表的行,当行中"主键"列为""时,将该行从表中删除.执行时就出现了"集合已修改:枚举操作可能无法执行."的c#错误提示.c#错误代 ...

  3. 集合已修改;可能无法执行枚举操作。

    问题描述:在用foreach遍历hashtable的时候,弹出"集合已修改:可能无法执行枚举操作." 问题代码: private void Check(int TimeOut)   ...

  4. 集合已修改,可能无法执行枚举操作

    原因: 不要在foreach里做删除或增加集合的操作 在循环的时候,当集合被删除了一个item后,那么总数 count和索引就会发生改变.所以会报错 解决方法: 不要在List上执行枚举集合的操作(例 ...

  5. VS2017 无法启动 IIS EXPRESS Web 服务器。 工作进程未能正确初始化,因而无法启动。返回的数据为错误信息。已解决!!!

    在应用程序中看到两个报错 1.在要求开始处理 http 请求时,应用程序池"Clr4IntegratedAppPool"的工作进程(PID="488")未能初始 ...

  6. SQL错误信息:已更新或删除的行值要么不能使该行成为唯一行、要么改变了多个行

    原因:数据库两行记录一模一样.删除其中一条就会报错 解决方法 1.单击SQL Server  Management Studio工具栏上的"新建查询"按钮,然后按照提示登陆要修改的 ...

  7. 编译器错误信息: CS1595: 已在多处定义“ ”;一种可能出现的情况

    先说一下网上经常能搜到的情况. http://liubiqu.cnblogs.com/archive/2004/11/30/71025.aspx 这个说了两种情况,方法 1:在 C# 编译器定义中包括 ...

  8. PL/SQL“ ORA-14551: 无法在查询中执行 DML 操作”解决

    环境 Oracle 11.2.0 + SQL Plus 问题 根据以下要求编写函数:将scott.emp表中工资低于平均工资的职工工资加上200,并返回修改了工资的总人数.PL/SQL中有更新的操作, ...

  9. 修改html文件500错误信息,打开网页提示 HTTP500错误的终极解决方法

    http 500内部服务器错误说明IIS服务器无法解析ASP代码,访问一个静态页面试试是否也出现这个问题,如果访问静态页面没问题,那就要分以下几种 情况来分析了: ① 你是否改变过计算机名称. ② 站 ...

最新文章

  1. Elasticsearch入门和基本使用
  2. AlertDialog 宽度充满整个屏幕
  3. Linux socket 网络编程常用函数总结
  4. Stust2的拦截器的运行流程及使用方法、注意事项
  5. 一个express老系统csrf漏洞修复
  6. 公共技术点之 Java 反射 Reflection
  7. 网络经典命令行【网络高手必备】
  8. Collections集合工具类的方法_addAllshuffle
  9. 如何在 JavaFX 的 TextArea 实现回车发送信息而不换行,但组合键 Ctrl + Enter 换行
  10. 《拯救人类》:很有可能改变人类历史进程的书
  11. Nginx 负载均衡策略之加权轮询分析
  12. element table批量删除_element 表格批量删除
  13. python处理word或者pdf文件_利用python程序生成word和PDF文档的方法
  14. 解题:洛谷3402 可持久化并查集
  15. Base64加密处理
  16. 通过xmlhttp实现-报告归档
  17. 使用Java 8 Stream像操作SQL一样处理数据(上) 1
  18. servlet的请求和重定向详解
  19. qq降龙v5java_java编辑器
  20. 学地质灾害还是学计算机专业,地质灾害与防治技术专科专业介绍

热门文章

  1. heartbeat如何监控程序_一文看懂MyCAT 命令行监控命令,监控调优必备
  2. 服务器中W3SVC1文件夹的文件,完美解决IIS 服务器无法加载应用程序 '/LM/W3SVC/1/ROOT'。错误是 '没有注册类别...
  3. android手机上传不了图片,【报Bug】nvue页面使用web-view组件,安卓手机无法调用页面的input标签上传图片...
  4. idea 自动生成mybaits_如何让idea自动创建mybatis配置文件?
  5. 华为魔术2手机拆机图解_荣耀Magic2手机内部做工如何?荣耀Magic2手机拆机
  6. mac bash file密码_Mac系统 | 入门级程序员的开始:Hello word!
  7. 【数据库原理实验(openGauss)】实验报告
  8. Airpal安装部署
  9. SparkStreaming 入门案例之wordcount
  10. scala循环 方法与函数