2013-12-13 2 views
0

У меня есть 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 

ответ

1

Вы должны попробовать добавьте параметр DoWorkEventsArgs в функцию ErrorReport.

Private Sub ErrorReport(ByVal Ex As Exception, 
        Optional ByVal CustomMessage As String = "", 
        ByVal e As DoWorkEventsArgs) 

Call Me.WB.Close(SaveChanges:=False) 
    If e.WorkerSupportsCancellation = True Then 
     e.CancelAsync() 
    End If 

Вы сможете отменить Фоноверто.

+0

Спасибо, но я тоже получаю такой же результат. –

 Смежные вопросы

  • Нет связанных вопросов^_^