Фоновый работник не работает правильно - PullRequest
0 голосов
/ 27 апреля 2010

Я создал фоновый рабочий для запуска довольно длинной задачи, которая включает в себя создание большего количества потоков, которые будут считывать из файла 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

надеюсь, что это яснее

Мой основной поток также запускает формы, из которых вызывается этот фон, но предполагается, что основной поток ожидает завершения фонового процесса, если пользователь не выберет другую опцию из главной формы.

1 Ответ

2 голосов
/ 27 апреля 2010

Как выглядит ваша основная программа? Вы запускаете некоторые фоновые темы. Фоновый поток останавливается всякий раз, когда больше нет приоритетных потоков для программы.

Вам нужно дождаться завершения потоков, которые вы начали, прежде чем выйти из Main ().

...