Я создал фоновый рабочий для запуска довольно длинной задачи, которая включает в себя создание большего количества потоков, которые будут считывать из файла URL-адресов и сканировать каждый из них. Я попытался проследить это путем отладки и обнаружил, что фоновый процесс заканчивается преждевременно без видимой причины. Есть ли что-то не так в логике моего кода, который вызывает это. Я постараюсь вставить как можно больше, чтобы иметь смысл.
While Not myreader.EndOfData
Try
currentRow = myreader.ReadFields()
Dim currentField As String
For Each currentField In currentRow
itemCount = itemCount + 1
searchItem = currentField
generateSearchFromFile(currentField)
processQuerySearch()
Next
Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
Console.WriteLine(ex.Message.ToString)
End Try
End While
Этот первый бит кода является циклом для ввода из файла, и именно это делает фоновый работник. Следующий фрагмент кода - это когда фоновый работник создает потоки для работы со всеми «посадочными страницами». После создания около 10 потоков фоновый работник выходит из этого подпрограммы, пропускает цикл ввода файлов и выходит из программы.
Try
For Each landingPage As String In landingPages
pgbar.Timer1.Stop()
If VisitedPages.Contains(landingPage) Then
Continue For
Else
Dim thread = New Thread(AddressOf processQuery)
count = count + 1
thread.Name = "Worm" & count
thread.Start(landingPage)
If numThread >= 10 Then
For Each thread In ThreadList
thread.Join()
Next
numThread = 0
Continue For
Else
numThread = numThread + 1
SyncLock ThreadList
ThreadList.Add(thread)
End SyncLock
End If
End If
Next
Моя основная программа, в которой я создаю фоновый поток, выглядит следующим образом:
Private Sub btnSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearch.Click
isClicked = True
ProgressBar1.Value = 10
Me.BackgroundWorker1.RunWorkerAsync()
Timer1.Interval = 10000
....
функция background do work не отображается, но в основном вызывает эту функцию в другом классе ....
BlogDiscoverObj.start()
Теперь, когда я пытался дождаться всех потоков, здесь во втором блоке кода выше:
Dim thread = New Thread (AddressOf processQuery)
count = count + 1
thread.Name = "Worm" & count
Thread.start (LandingPage)
Если numThread> = 10, то
Для каждой темы в ThreadList
Thread.join ()
следующий
numThread = 0
Продолжить для
еще
numThread = numThread + 1
SyncLock ThreadList
ThreadList.Add (резьба)
End SyncLock
End If
End If
Далее
Thread.Sleep(1000)
For Each Thread In ThreadList
Thread.Join()
Next
надеюсь, что это яснее
Мой основной поток также запускает формы, из которых вызывается этот фон, но предполагается, что основной поток ожидает завершения фонового процесса, если пользователь не выберет другую опцию из главной формы.