我正在尝试向我的程序添加一个STOP按钮,以阻止后台工作人员。以下我没有运气。
这是我的按钮事件
Private Sub GOButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GOButton.Click
If BackgroundWorker1.IsBusy Then
Exit Sub
Else
PullIPs()
End If
End If
End Sub
PullIPs子程序有很多内容,最后启动后台工作程序
BackgroundWorker1.RunWorkerAsync()
Backgroundworker1启动另一个子,就像这样
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
BackgroundWorker1.ReportProgress(50)
PingAll()
End Sub
所以,在那个迷宫之后,我想要一种方法来阻止背景工作者在PingAll()'。
。最后,
Private Sub StopButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StopButton.Click
BackgroundWorker1.CancelAsync()
End Sub
注意:启用了SupportCancelation IS。我也到处都看了,看起来我在做,它应该如何工作......
答案 0 :(得分:3)
看起来你已经看过了整个地方,除了你应该首先看到的一个显而易见的地方,即帮助文档。 BackgroundWorker.CancelAsync
方法的doco可以这样说:
CancelAsync提交终止待处理后台的请求 操作并将CancellationPending属性设置为true。
当您调用CancelAsync时,您的工作方法有机会 停止执行并退出。工作人员代码应定期检查 CancellationPending属性,以查看它是否已设置为true。
你的代码在哪里按照指示进行?无处,所以你显然没有做到它应该如何运作。
致电CancelAsync
仅请求取消。您仍然需要向DoWork
事件处理程序添加代码以测试是否已请求取消并停止执行工作(如果已执行)。 DoWork
事件处理程序可以执行任何操作,因此调用CancelAsync
不会简单地在现场中止,而不考虑应用程序处于什么状态以及是否需要进行任何清理。
您知道正在做什么工作,所以您可以编写代码,以便可以在中途取消该工作。事实上,您所做的只是对PingAll
的一次调用,因此无法取消它。您需要重新构建该代码,例如将其转换为每次迭代执行一次ping操作的循环,然后如果需要,可以在迭代之间取消。