У меня есть BackgroundWorker
, который включает в себя класс ExcelOutput
, используемый для вывода различных данных в книгу, и я должен сразу указать, что установлен bw.WorkerSupportsCancellation = True
.Не удается отменить BackgroundWorker procss
На каждом этапе вывода я проверки на наличие ошибок в ExcelOutput
с помощью Try/Catch
, и при необходимости отображать сообщение об ошибке (используя функцию с именем ErroReport()
.
В связи с сообщением об ошибке, я хочу, чтобы отменить BackgroundWorker
, чтобы избежать дальнейших ошибок. с этой целью я добавил OutputWorker
свойство к ExcelOutput
классу и я установил, что быть копией моего BackgroundWorker
в методе bw_DoWork()
.
Однако отмена осуществляется в ExcelOutput.ErroReport()
не Worki нг, и я не знаю, почему.
Обратите внимание, что я испробовал значение bw.CancellationPending
и после ошибки оно установлено в True
. Я также тестировал, что следующее условие If
работает, показывая окно сообщения, и это также работает. По какой-то причине кажется, что команда Exit Sub
игнорируется.
Может ли кто-нибудь предположить, что я делаю неправильно? Благодарю.
Вот как bw_DoWork()
функция от BackgroundWorker
класса устанавливается -
Private Sub bw_DoWork(ByVal sender As Object,
ByVal e As DoWorkEventArgs)
Dim Excel As New ExcelOutput ' Create a new instance of the ExcelOutput class
Dim CurrentRow As Integer = 4 ' Set the first output row
'** Include a copy of the OutputWorker in the ExcelOutput (so that the OutputWorker can be cancelled)
Excel.OutputWorker = Me
If bw.CancellationPending = True Then
e.Cancel = True
Exit Sub
Else
Excel.Prepare()
End If
If bw.CancellationPending = True Then
e.Cancel = True
Exit Sub
Else
CurrentRow = Excel.OutputGroup("General", Headers, Data, 4)
End If
' More stuff here...
End Sub
Вот как ErrorReport()
функция от ExcelOutput
класса устанавливается -
Private Sub ErrorReport(ByVal Ex As Exception,
Optional ByVal CustomMessage As String = "")
Call Me.ResetRange() ' Destroy the 'Range' object
Dim ErrorMessage As String = "Message: " & Ex.Message ' Set the default message
If CustomMessage <> "" Then ErrorMessage = CustomMessage & vbCrLf & vbCrLf & Ex.Message
Dim Result As Integer = MessageBox.Show(ErrorMessage,
"An Error Has Occured",
MessageBoxButtons.OK,
MessageBoxIcon.Stop)
'** Close the workbook (if it's open) and stop the OutputWorker *'
Try
Call Me.WB.Close(SaveChanges:=False)
If Me.OutputWorker.WorkerSupportsCancellation = True Then
Me.OutputWorker.CancelAsync()
End If
Catch
End Try
End Sub
Спасибо, но я тоже получаю такой же результат. –