这是我的代码,
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。
答案 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
确保索引超出范围错误不会发生,并确保您的操作已安装,并执行正确的订单/项目。