遍历hashtable同时修改value时异常处理:
InvalidOperationException是当方法调用对于对象的当前状态无效时引发的异常。
一般如果调用方法失败不是由无效参数造成的,则使用 InvalidOperationException。(如果方法调用失
败是由无效参数造成的,则应改为引发 ArgumentException 或其派生类 ArgumentNullException 或
ArgumentOutOfRangeException。)
例如
如果创建枚举数后修改了集合中的对象,则由 MoveNext 引发该异常。//我的就是这种情况
如果执行方法调用前关闭了资源集,则由 GetString 引发该异常。
LdfldaMicrosoft 中间语言 (MSIL) 指令引发 InvalidOperationException。
我的程序中用到了异步和多线程,异常只有在不调试执行的情况下出现(调试不出现),而且只是在第一次执
行出现其他时候偶尔出现,这样最终也没有找到好的解决办法,开始只是把异常屏蔽掉。
最终还是不知道为什么hashtable不能在遍历是时候修改(不知道是不是因为处于线程安全的考虑),不过可以找到方法不在遍历的时候修改hashtable:把keys copyto 到一个Array然后通过遍历Array达到修改hashtable中value的目的代码如下:
- int count=this.hash_clients.Count ;
- string[] keys = new string[count];
- this.hash_clients.Keys.CopyTo(keys,0);
- foreach (string client in keys)
- {
- socketclient = (Socket)this.hash_clients [client];
- socketclient.Close();
- }
出现异常的代码段:
- Socket socketclient;
- //遍历hashtable
- if (this.hash_clients.Count > 0)
- {
- try
- {
- foreach (System.Collections.DictionaryEntry objDE in this.hash_clients)//异常出现处
- {
- socketclient = (Socket)objDE.Value;
- socketclient.Close();
- }
- }
- catch (Exception moveException)
- {
- //throw moveException;
- throw new Exception("客户端终端异常!!");
- }
- 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)