收集被修改;枚举操作可能无法执行。 VB thearding

时间:2014-10-04 08:55:44

标签: vb.net

这是我的代码,

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    For Each kthread As Thread In _threads
        If kthread.Name = "123" Then
            _threads.Remove(kthread)
            kthread.Abort()
            killedthreads += 1 'a integer
        End If
    Next
End Sub

我最后添加了killthreads整数作为检查,vb执行整个函数,但在最后一行它总是抛出标题中的错误。 不知道为什么,如果killthreads + = 1不存在则错误转到kthread.Abort()

今年早些时候我在使用不同的应用程序时遇到了同样的问题。

编辑,

 Public Sub KillThread(kThread As Thread)

        For i As Integer = (_threads.Count - 1) To 0 Step -1
            If _threads.Item(i).Name = kThread.Name Then
                _threads.Item(i).Abort()
                _threads.RemoveAt(i)
            End If
        Next

    End Sub

我按照Eminem的说法做了这个代码。如果某些东西不好或它已完成所有功能,这将从正在运行的线程中获取kThread。但我的问题是,只有发送它的第一个线程中止并从列表中删除,其他似乎在第一个线程中止后卡住。

我使用

创建线程
 Public Sub multiThreader(int As Integer, link As String)
        Dim tCount As Integer = _threads.Count
        If tCount >= Form1.ListView1.Items.Count Then
        Else
            Dim dy As Integer = DateTime.Now.Day
            Dim mo As Integer = DateTime.Now.Month
            Dim fileNum As String = dy.ToString() + "-" + mo.ToString() + "_" + int.ToString

            botThread = New Thread(Sub() MainThread(fileNum, link, botThread, int.ToString()))
            botThread.IsBackground = True
            botThread.Name = String.Format("AutoBotThread{0}", fileNum)
            _threads.Add(botThread)
            botThread.Start()
        End If
    End Sub

和_threads是公开的,Public _threads As New List(Of Thread)

MainThread是一个Public Sub,它运行函数并返回并在特定条件下发送KillThread。

1 个答案:

答案 0 :(得分:0)

问题是在完成迭代之前从枚举中删除了一个项目。

当计数从迭代变为另一个时,就像尝试从0迭代到list.count。正如Bjørn-RogerKringsjå所说,你应该这样做:

For i As Integer = (_threads.count - 1) to 0 Step -1
    If _threads.Item(i).Name = "123" Then
        _threads.Item(i).Abort
        _threads.RemoveAt(i)
        killedthreads += 1 'a integer
    End If
Next

使用Step -1确保索引超出范围错误不会发生,并确保您的操作已安装,并执行正确的订单/项目。