如何阻止代码在 RunWorkerAsync 之后执行下一行直到它完成?

How can I stop the code from executing the next line after RunWorkerAsync until it finishes?

我的 VB.NET (WPF) 应用程序有包含州名及其城市名称的下拉列表。我使用循环遍历选定的州及其城市,并执行一些有关城市的功能。我检查循环中每个城市的 N 个网页,并使用 BackGroundWorker 将一些结果填充到数据网格中。

但是,由于我在循环中使用了 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.RunWorkerCompletedworker.RunWorkerAsync 仍然是 运行宁?会不会等worker.RunWorkerAsync执行完了再执行worker.RunWorkerCompleted?我正在使用 BackgroundWorker 填充 UI 而不冻结它,城市变量在每次迭代中都会更新并在 RunWorkerAsync 中使用。所以,基本上,我试图完全执行 worker.RunWorkerAsync 然后移到下一行并继续循环。

如果我的语言没有意义,我很抱歉。我对此进行了研究并尝试了几种方法,我来到这里是因为 none 其中有效。由于一些版权问题,我无法分享完整的代码,但我很乐意提供更多信息。

我不知道这是否可以成为你的选择:

'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

RunWorkerAsync 完成后自动调用 RunWorkerCompleted(请参阅 BackgroundWorker Class 文档)。

循环应该在 BGW 中,连同你想要在每次迭代结束时 运行 的代码。


(请注意,BackgroundWorker.ReportProgress Method 可以将对象作为其第二个参数,因此如果您使合适的 Class 传递,您可以将任何您想要的内容发送到 ProgressChanged 处理程序。)