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

遍历hashtable同时修改value时异常处理:

 

InvalidOperationException是当方法调用对于对象的当前状态无效时引发的异常。

一般如果调用方法失败不是由无效参数造成的,则使用 InvalidOperationException。(如果方法调用失

败是由无效参数造成的,则应改为引发 ArgumentException 或其派生类 ArgumentNullException 或

ArgumentOutOfRangeException。)


例如

如果创建枚举数后修改了集合中的对象,则由 MoveNext 引发该异常。//我的就是这种情况
如果执行方法调用前关闭了资源集,则由 GetString 引发该异常。
LdfldaMicrosoft 中间语言 (MSIL) 指令引发 InvalidOperationException。

 

我的程序中用到了异步和多线程,异常只有在不调试执行的情况下出现(调试不出现),而且只是在第一次执

行出现其他时候偶尔出现,这样最终也没有找到好的解决办法,开始只是把异常屏蔽掉。

最终还是不知道为什么hashtable不能在遍历是时候修改(不知道是不是因为处于线程安全的考虑),不过可以找到方法不在遍历的时候修改hashtable:把keys copyto 到一个Array然后通过遍历Array达到修改hashtable中value的目的代码如下:

 

  1.                     int count=this.hash_clients.Count ;
  2.                     string[] keys = new string[count];
  3.                     this.hash_clients.Keys.CopyTo(keys,0);
  4.                     foreach (string client in keys)
  5.                     {
  6.                         socketclient = (Socket)this.hash_clients [client];
  7.                         socketclient.Close();
  8.                     }

出现异常的代码段:

  1.  Socket socketclient;
  2.             //遍历hashtable
  3.             if (this.hash_clients.Count > 0)
  4.             {
  5.                 try
  6.                 {
  7.                     foreach (System.Collections.DictionaryEntry objDE in this.hash_clients)//异常出现处
  8.                     {
  9.                         socketclient = (Socket)objDE.Value;
  10.                         socketclient.Close();
  11.                     }
  12.                 }
  13.                 catch (Exception moveException)
  14.                 {
  15.                     //throw moveException;
  16.                     throw new Exception("客户端终端异常!!");
  17.                 }
  18.               
  19.                 hash_clients.Clear();

************** 异常文本 **************
System.InvalidOperationException: 集合已修改;可能无法执行枚举操作。
   在 System.Collections.Hashtable.HashtableEnumerator.MoveNext()
   在 Network.SocketHelp.Stop() 位置 E:/项目开发程序/SD_TcpServer1.1

/Network/Network/SocketHelp.cs:行号 130
   在 SD_TcpServer1._0.SD_Tcp_RemoteControlServer.allStop_Click(Object sender, EventArgs e)

位置 E:/项目开发程序/SD_TcpServer1.1/SD_TcpServer1.0/SD_Tcp_RemoteControlServer.cs:行号 92
   在 System.Windows.Forms.Control.OnClick(EventArgs e)
   在 System.Windows.Forms.Button.OnClick(EventArgs e)
   在 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   在 System.Windows.Forms.Control.WndProc(Message& m)
   在 System.Windows.Forms.ButtonBase.WndProc(Message& m)
   在 System.Windows.Forms.Button.WndProc(Message& m)
   在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam,

IntPtr lparam)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值