2

我正在开发一个使用后台工作人员的程序,我正试图让我的取消工作。取消程序时,我希望它更新我的数据库(将其放入操作已取消的日志中)并发送一封包含状态的电子邮件。

我的程序中有以下代码:(在后台工作人员的顶部)

If bworker.CancellationPending Then
    e.Cancel = True
    Exit Do
End If

哪个有效,让我进入脚本的 bgworker_RunWorkerCompleted 部分。但从那里它分崩离析。我遇到了很多异常,它们要么像“操作被取消”一样简单,要么是它试图在不应该调用已处置对象时出现错误。

这是 RunWorkerCompleted 的代码:

Private Sub bgworker_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs) Handles bgworker.RunWorkerCompleted
    StopTimer()

    If e.Cancelled Then
        Call UpdateDB(e.Result(0), e.Result(1), e.Result(5), e.Result(2), e.Result(3), "Cancelled")
        MessageBox.Show("Got Here - Cancelled")
        CloseMe()
    Else
        MessageBox.Show("Got Here - Complete")
        Call UpdateDB(e.Result(0), e.Result(1), e.Result(5), e.Result(2), e.Result(3), e.Result(7))
        CloseMe()
    End If
End Sub

CloseMe() 只是关闭窗口,删除托盘图标,并决定是完全关闭程序还是返回主菜单。当我取消程序并且我没有第一个 MessageBox.Show(在取消部分内)时,我看到了完整/未取消代码区域内的消息框。将 MessageBox.Show 放入取消区域后,我开始收到通用的“操作已取消”异常。

关于如何完成此操作的任何想法,以便可以取消操作,同时允许它提醒我它已被取消并且不引发异常?

谢谢!

4

1 回答 1

1

文档中

您的 RunWorkerCompleted 事件处理程序应始终在访问 Result 属性之前检查 Error 和 Canceled 属性。如果引发异常或取消操作,则访问 Result 属性会引发异常。

(强调我的)

我不知道你的Result对象中有什么,但有没有另一种方法可以将值发回以进行日志记录?
一种选择是设置Cancel属性,而是在Result对象中存储一些内容以指示取消状态。换句话说,就像操作成功一样,在您的结果中存储一个指示取消发生的标志。

于 2013-05-28T15:04:08.207 回答