取消后台工作者,更新数据库和邮件

时间:2013-05-28 14:52:24

标签: vb.net exception backgroundworker

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

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

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,我就开始获得通用的“操作已被取消”异常。

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

谢谢!

1 个答案:

答案 0 :(得分:1)

来自the documentation

  

您的RunWorkerCompleted事件处理程序应始终检查错误   访问Result属性前已取消和已取消的属性。如果   异常被提出或如果操作被取消,访问   结果属性引发异常。

(强调我的)

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