Как я могу остановить выполнение кода следующей строкой после RunWorkerAsync до ее завершения? - PullRequest
0 голосов
/ 19 сентября 2019

В приложении VB.NET (WPF) есть раскрывающиеся списки с названиями штатов и их городов.Я использую цикл для перебора выбранного штата и его городов, и я выполняю некоторые функции, касающиеся городов.Я проверяю N веб-страниц для каждого города в цикле и заполняю таблицу данных с некоторыми результатами, используя BackGroundWorker .

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

Я исследовалэто раньше, и единственная возможность, которую дали мне решения, заключалась в том, чтобы ввести RunWorkerCompleted в коде.Это будет означать, что мне придется разделить мой код на две части и поместить материал, который я хочу выполнить позже, в RunWorkerCompleted .Будет ли это работать в цикле?Вот несколько псевдокодов:

For i as integer = 0 to cityCount

Dim city as string = cbCity.SelectedValue.ToString()
worker.RunWorkerAsync
worker.RunWorkerCompleted
cbCity.SelectedIndex += 1

Next

Вот в чем дело.Разве приведенный выше псевдокод не запускает worker.RunWorkerCompleted , пока worker.RunWorkerAsync все еще работает?Будет ли он ждать завершения и завершения worker.RunWorkerAsync , а затем выполнить worker.RunWorkerCompleted ?Я использую BackgroundWorker для заполнения пользовательского интерфейса без его замораживания, а переменная city обновляется на каждой итерации и используется внутри RunWorkerAsync.Итак, по сути, я пытаюсь полностью выполнить worker.RunWorkerAsync, а затем перейти к следующей строке и продолжить цикл.

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

1 Ответ

0 голосов
/ 20 сентября 2019

Я не знаю, может ли это быть вашей альтернативой или нет:

'Iteration Sub
Private Sub MyStatus()
    'Here your code iteration
    For i As Integer = 1 To 10000
        BackgroundWorker1.ReportProgress(CInt(100 * i / 10000))
        If BackgroundWorker1.CancellationPending = True Then Exit For
    Next
End Sub

'For begin and stop Async
Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
    BackgroundWorker1.CancelAsync()
    Try
        BackgroundWorker1.RunWorkerAsync()
    Catch ex As Exception
    End Try
End Sub

'To Call the iteration
Private Sub bw1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    MyStatus()
End Sub

'To Monitor the progress
Private Sub bw1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    Me.ProgressBar1.Value = e.ProgressPercentage
End Sub

'If any information need to indicate that the iteration is complete
Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
End Sub
...