如何阻止代码在 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.RunWorkerCompleted 而 worker.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 处理程序。)
我的 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.RunWorkerCompleted 而 worker.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 处理程序。)