停止后台工作人员

时间:2015-09-03 01:22:28

标签: vb.net

我正在尝试向我的程序添加一个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。我也到处都看了,看起来我在做,它应该如何工作......

1 个答案:

答案 0 :(得分:3)

看起来你已经看过了整个地方,除了你应该首先看到的一个显而易见的地方,即帮助文档。 BackgroundWorker.CancelAsync方法的doco可以这样说:

  

CancelAsync提交终止待处理后台的请求   操作并将CancellationPending属性设置为true。

     

当您调用CancelAsync时,您的工作方法有机会   停止执行并退出。工作人员代码应定期检查   CancellationPending属性,以查看它是否已设置为true。

你的代码在哪里按照指示进行?无处,所以你显然没有做到它应该如何运作。

致电CancelAsync仅请求取消。您仍然需要向DoWork事件处理程序添加代码以测试是否已请求取消并停止执行工作(如果已执行)。 DoWork事件处理程序可以执行任何操作,因此调用CancelAsync不会简单地在现场中止,而不考虑应用程序处于什么状态以及是否需要进行任何清理。

您知道正在做什么工作,所以您可以编写代码,以便可以在中途取消该工作。事实上,您所做的只是对PingAll的一次调用,因此无法取消它。您需要重新构建该代码,例如将其转换为每次迭代执行一次ping操作的循环,然后如果需要,可以在迭代之间取消。