向版主和各位高手求救!

*************在Form中的定义:
Private sckClients As New Hashtable()

*************程序代码:
Dim sUnitID As String
Dim I As Integer
Dim client As MonitorClient(这是我自己定义的类,主要是用TcpClient与客房端通讯的)
Dim entry As DictionaryEntry

For I = 3 To VSFlexGrid.Rows - 1
sUnitID = VSFlexGrid.get_TextMatrix(I, 1)
For Each entry In sckClients
client = CType(entry.Value, MonitorClient)
If sckClients.Contains(sUnitID) Then
DoResetClient(client) '关闭客户端连接
client = Nothing
End If
Next entry
Next I

当关闭了一个客户端连接后,程序执行到Next entry时报错:

-------------------------------------------------------------
未处理的“System.InvalidOperationException”类型的异常出现在 mscorlib.dll 中

其他信息:集合已修改;枚举操作可能不会执行。
-------------------------------------------------------------

这个问题是怎么回事?该如何解决呢?

---------------------------------------------------------------

只有一种可能,你在DoResetClient(client)中修改了sckClients,估计你可能是断开连接时从集合中删除实例,这样将导致枚举操作出错,试着修改DoResetClient(client)代码,把删除子项的代码去除应该就有问题了。
---------------------------------------------------------------

在循环中不能够删除循环集合/数组中的元素!

如果您要求通过循环删除集合/数组中的元素,那么应该通过在第一次循环中记录下来,然后在第二次循环中删除。如例:

Sub RemoveSomethin(ByVal aSource as ArrayList)
Dim aNeedToRemove As New ArrayList()
Dim i As Integer;

For Each i In aSource
If i<0 Then aNeedToRemove.Add(i) '此记录需要删除。
Next
For Each i In aNeedToRemove
aSouce.Remove(i)
Next
End Sub

或者通过倒序循环:

For i = aSouce.Count - 1 To 0 Step -1
If aSouce(i)<0 Then
aSouce.RemoveAt(i)
End If
Next

我提供的是思路,具体问题具体修改。

---------------------------------------------------------------

这个跟你的对象有没有打开/关闭联接没什么关系。主要是你在枚举的时候试图改变枚举集合中的结构(增加/减少)。

Published At
Categories with Web编程
Tagged with
comments powered by Disqus