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

问题描述:在用foreach遍历hashtable的时候,弹出“集合已修改;可能无法执行枚举操作。”

问题代码:       

 private void Check(int TimeOut)        //这是一个存活检查线程,为了把连接失效的主机剔除
        {
            DateTime t = DateTime.Now;//取出当前的时间
           //Hashtable
            foreach (DictionaryEntry item in _transmit_tb)//弹出“集合已修改;可能无法执行枚举操作。”
            {
                
                if ((t - (DateTime)Time[item.Key]).Seconds > TimeOut)
                {
                    LogOut(item.Key);                                   
   //此函数的作用是剔除失效的主机

                }
            }
        }

解决方法:利用for进行遍历。

ArrayList   akeys=new   ArrayList(_transmit_tb.Keys);   
for(int   p=akeys.Count-1;p> -1;p--) 

_transmit_tb.Remove(akeys[p]); 
}

原因:

1、hashtable存放你放入的值的时候   不是按照你存放顺序放的 
所以当你用foreach遍历的时候   就不能保证遍历出来的顺序和你原来存放进去的顺序是一致的

2、msdn的解释:foreach 语句是对枚举数的包装,它只允许从集合中读取,不允许写入集合。

也就是,不能在foreach里遍历的时侯把它的元素进行删除或增加的操作的

部分内容参考:http://topic.csdn.net/t/20050412/21/3931090.html

另外附上一篇:集合遍历时删除和增加元素

http://blog.csdn.net/educast/article/details/5875955

作者:kissazi2 
出处:http://www.cnblogs.com/kissazi2/ 
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/kissazi2/archive/2012/02/29/2977145.html

时间: 2024-11-17 17:13:15

集合已修改;可能无法执行枚举操作。的相关文章

c#-C# winform项目,退出应用程序时,报"集合已修改,可能无法执行枚举操作。"错误信息。

问题描述 C# winform项目,退出应用程序时,报"集合已修改,可能无法执行枚举操作."错误信息. 在C# winform项目中,有两个form窗体(form1.form2),在form1中有个两个button按钮. 在form1窗体中,点击button1弹出一个form2窗体,点击button2退出整个应用程序. 目前遇到的问题是,在form1窗体中点击button1弹出一个form2窗体后再点击button2退出整个应用程序时,报"集合已修改,可能无法执行枚举操作.&

C# 集合已修改;可能无法执行枚举操作

/********************************************************************** * C# 集合已修改;可能无法执行枚举操作 * 说明: * 之前搞Java的时候就很清楚使用多线程操作集合的时候,很容易出现线程 * 安全的问题,还有就是操作线程的时候容易出现集合被修改的问题. * * 2016-12-12 深圳 南山平山村 曾剑锋 ****************************************************

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

        foreach是取只读的,在取的时候数据不能变(包括修改,删除,添加等).要避免这个问题,就应该使用for循环.         以前没有考虑过对collection类型对象操作时for 和foreach的区别,总感觉foreach更方便一些.今天写了个foreach循环来遍历一个Dictionary,之后在foreach体内又对其添加,表面上逻辑和写法看着没错,但在运行时出现异常:查询集合已修改:可能无法执行枚举操作.查了一下,这个是使用foreach的典型的问题.

c#-调用AddRange()方法时被提示"集合被修改,枚举操作可能无法进行"

问题描述 调用AddRange()方法时被提示"集合被修改,枚举操作可能无法进行" 实在搞不懂来提问,我并没有修改什么东西啊. 解决方案 看你的代码,addrange本身会修改集合.不要在foreach迭代中调用它. 解决方案二: 循环和迭代中不要对集合进行修改

[SocketException (0x2747): 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。 58.64.137.80:81]

问题描述 [SocketException(0x2747):由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作.58.64.137.80:81]System.Net.Sockets.Socket.DoConnect(EndPointendPointSnapshot,SocketAddresssocketAddress)+239System.Net.Sockets.Socket.InternalConnect(EndPointremoteEP)+35System.Net.ServicePoi

MODEM不执行拨号操作的原因及解决方法

在用MODEM上网时,我们很可能会碰到MODEM不执行拨号操作的麻烦.在正确连接微机.MODEM和电话线后,进行拨号上网操作时,如果MODEM没有拨号音,始终没连接上或指示灯没闪烁,表明MODEM没有执行拨号操作,造成该种故障的原因很多,现分析如下: 1.上一次使用时能否正确执行拨号操作,若上次使用时能拨号而现在不能拨号,请参见第2步,否则转到第5步. 2.最近是否修改过有关MODEM.串行端口的设置,若修改过,请将相关参数恢复成修改前的设置再试.如果问题解决,则MODEM可正常工作了,否则继续

Windows7计算机管理提示"该文件没有与之关联的程序来执行该操作"解决方法

 今天右键计算机-管理,居然提示"该文件没有与之关联的程序来执行该操作.请安装一个程序.或者,如果已安装程序,请在"默认程序"控制面板中创建关联."怀疑是自己上次用去除快捷方式造成的问题.下面是两种解决方法,我用了方法2就搞定了. 代码如下:<p>Windows Registry Editor Version 5.00</p><p>[HKEY_CLASSES_ROOTCLSID{20D04FE0-3AEA-1069-A2D8-08

win7系统无法进入计算机管理,提示“该文件没有与之关联的程序来执行该操作”

知识点分析: Win7系统,在桌面或者开始菜单的"计算机"上单击右键选择"管理"之后.无法进入计算机管理,提示"该文件没有与之关联的程序来执行该操作.请安装一个程序,或者,如果已安装程序,请在'默认程序'控制面板中创建关联."如图所示: 操作步骤: Win7系统使用优化大师或者360等优化软件优化系统之后(特别是针对桌面图标快捷方式的小箭头优化),就会弹出类似上图的对话框. 在注册表中有两个和是否显示快捷方式"小箭头"有关的键

mysql在cmd命令下执行数据库操作

windows+r 运行cmd命令,执行以下操作! 当mysql 数据库文件相对于来说比较大的时候,这个时候你可能在正常环境下的mysql中是导入不进去的,因为mysql数据库本身就有默认的导入文件大小 , 这个时候就要用到 cmd命令去操作mysql数据库了 , 以下我就简单介绍下 , 如何去对mysql 数据库 进行增删改查的操作! 操作一: cd D:\phpStudy\MySQL\bin //使用cd 命令进行查找 mysql 下的bin文件 找到你的安装目录查找即可 操作二: mysq