-1

Here is my code,

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

I added the killedthreads integer at last as a check, vb executes the whole function good but at the last line it always throw the error said in title. Not sure why, if killedthreads += 1 is not there then the error goes to kthread.Abort()

I had the same problem with C# with a different app earlier this year.

Edit,

 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

I did this code as Eminem said it. This gets in kThread from the running threads if something is not good or it has finished all its functions. But my problem is that, only the first thread that sends it gets abort and removed from list, others seem to get stuck once the first thread is aborted.

I create threads using,

 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

and _threads is publicly, Public _threads As New List(Of Thread)

MainThread is a Public Sub which runs functions and gets return and send KillThread under certain conditions.

kks21199
  • 1,116
  • 2
  • 10
  • 29

1 Answers1

1

The problem is that you remove an item from an enumeration, before you finished iterating through it.

It's like trying to iterate from 0 to list.count, when the count changes from an iteration to another. As Bjørn-Roger Kringsjå said, you should do something like this:

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

By using Step -1 you make sure that an Index was out of range error will not occur, and make sure that your operations are fitted, and execute on the right order/item.

Eminem
  • 870
  • 5
  • 20