我正在开发一个使用后台工作程序的程序,我正在努力让我的取消工作。取消程序时,我希望它更新我的数据库(将其放入操作被取消的日志中)并发送一封状态的电子邮件。
我的程序中有以下代码: (在后台工作者的顶部)
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,我就开始获得通用的“操作已被取消”异常。
关于如何完成此操作的任何想法,以便可以取消操作,同时允许它提醒我它已被取消而不抛出异常?
谢谢!
答案 0 :(得分:1)
您的RunWorkerCompleted事件处理程序应始终检查错误 访问Result属性前已取消和已取消的属性。如果 异常被提出或如果操作被取消,访问 结果属性引发异常。
(强调我的)
我不知道你的Result
对象中有什么内容,但是还有另一种方法可以将值发回信号用于记录吗?
一种选择是不设置Cancel
属性,而是在Result
对象中存储一些内容以指示取消状态。换句话说,就像操作成功一样,在结果存储区中显示一个标志,表明发生了取消。