错误信息: 集合已修改;可能无法执行枚举操作。
错误信息: 集合已修改;可能无法执行枚举操作。
调用堆栈:
在 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
错误信息: 集合已修改;可能无法执行枚举操作。相关推荐
- c#“集合已修改;可能无法执行枚举操作”
list中用了remove操作,结果报这个错误. 使用foreach不能执行删除.修改,这是规定.你可以使用for循环遍历修改. 如果你是删除的话,for循环 i 要从大到小,比如: for(int ...
- 怎么回事儿?C#错误:集合已修改;枚举操作可能无法执行。
本意是遍历表的行,当行中"主键"列为""时,将该行从表中删除.执行时就出现了"集合已修改:枚举操作可能无法执行."的c#错误提示.c#错误代 ...
- 集合已修改;可能无法执行枚举操作。
问题描述:在用foreach遍历hashtable的时候,弹出"集合已修改:可能无法执行枚举操作." 问题代码: private void Check(int TimeOut) ...
- 集合已修改,可能无法执行枚举操作
原因: 不要在foreach里做删除或增加集合的操作 在循环的时候,当集合被删除了一个item后,那么总数 count和索引就会发生改变.所以会报错 解决方法: 不要在List上执行枚举集合的操作(例 ...
- VS2017 无法启动 IIS EXPRESS Web 服务器。 工作进程未能正确初始化,因而无法启动。返回的数据为错误信息。已解决!!!
在应用程序中看到两个报错 1.在要求开始处理 http 请求时,应用程序池"Clr4IntegratedAppPool"的工作进程(PID="488")未能初始 ...
- SQL错误信息:已更新或删除的行值要么不能使该行成为唯一行、要么改变了多个行
原因:数据库两行记录一模一样.删除其中一条就会报错 解决方法 1.单击SQL Server Management Studio工具栏上的"新建查询"按钮,然后按照提示登陆要修改的 ...
- 编译器错误信息: CS1595: 已在多处定义“ ”;一种可能出现的情况
先说一下网上经常能搜到的情况. http://liubiqu.cnblogs.com/archive/2004/11/30/71025.aspx 这个说了两种情况,方法 1:在 C# 编译器定义中包括 ...
- PL/SQL“ ORA-14551: 无法在查询中执行 DML 操作”解决
环境 Oracle 11.2.0 + SQL Plus 问题 根据以下要求编写函数:将scott.emp表中工资低于平均工资的职工工资加上200,并返回修改了工资的总人数.PL/SQL中有更新的操作, ...
- 修改html文件500错误信息,打开网页提示 HTTP500错误的终极解决方法
http 500内部服务器错误说明IIS服务器无法解析ASP代码,访问一个静态页面试试是否也出现这个问题,如果访问静态页面没问题,那就要分以下几种 情况来分析了: ① 你是否改变过计算机名称. ② 站 ...
最新文章
- Elasticsearch入门和基本使用
- AlertDialog 宽度充满整个屏幕
- Linux socket 网络编程常用函数总结
- Stust2的拦截器的运行流程及使用方法、注意事项
- 一个express老系统csrf漏洞修复
- 公共技术点之 Java 反射 Reflection
- 网络经典命令行【网络高手必备】
- Collections集合工具类的方法_addAllshuffle
- 如何在 JavaFX 的 TextArea 实现回车发送信息而不换行,但组合键 Ctrl + Enter 换行
- 《拯救人类》:很有可能改变人类历史进程的书
- Nginx 负载均衡策略之加权轮询分析
- element table批量删除_element 表格批量删除
- python处理word或者pdf文件_利用python程序生成word和PDF文档的方法
- 解题:洛谷3402 可持久化并查集
- Base64加密处理
- 通过xmlhttp实现-报告归档
- 使用Java 8 Stream像操作SQL一样处理数据(上) 1
- servlet的请求和重定向详解
- qq降龙v5java_java编辑器
- 学地质灾害还是学计算机专业,地质灾害与防治技术专科专业介绍
热门文章
- heartbeat如何监控程序_一文看懂MyCAT 命令行监控命令,监控调优必备
- 服务器中W3SVC1文件夹的文件,完美解决IIS 服务器无法加载应用程序 '/LM/W3SVC/1/ROOT'。错误是 '没有注册类别...
- android手机上传不了图片,【报Bug】nvue页面使用web-view组件,安卓手机无法调用页面的input标签上传图片...
- idea 自动生成mybaits_如何让idea自动创建mybatis配置文件?
- 华为魔术2手机拆机图解_荣耀Magic2手机内部做工如何?荣耀Magic2手机拆机
- mac bash file密码_Mac系统 | 入门级程序员的开始:Hello word!
- 【数据库原理实验(openGauss)】实验报告
- Airpal安装部署
- SparkStreaming 入门案例之wordcount
- scala循环 方法与函数