Background Worker отменить асинхронный не работает - PullRequest
1 голос
/ 27 марта 2019

Логика программы

Я работаю в фоновом режиме для чтения и записи файлов.Для проверки нажатия кнопки отмены я создал метод с именем "check_bgWorkerCancelled ()", и он должен обрабатывать все события, если ожидается отложенная передача.

Проблема

Когда я нажимаюкнопка отмены, рабочий продолжает работать.Когда я нажимаю кнопку «Пуск», старый процесс продолжает работать.

Код: для проверки отмены

' Method: To check is cancellation is pending
    Private Sub check_bgWorkerCancelled()
        ' check if cancellation is pending
        If bgWorker_Scanner.CancellationPending = True Then
            ' background worker cancel asynchronous operating
            If bgWorker_Scanner.IsBusy Then
                Try 'try to
                    ' cancel the threads
                    bgWorker_Scanner.CancelAsync()
                    ' dispose the background worker
                    bgWorker_Scanner.Dispose()
                Catch ex As Exception 'if exception
                    ' invoke error
                    utils.invoke_msg(3, "Worker Error", ex.Message.ToString)
                    Me.Close() 'close form
                End Try
            End If
            isScanning = False 'set scanning to false
            Try
                ' invoke to bypass illegal cross threading UI update
                BeginInvoke(CType(Sub()
                                      progressBar1.Value = 0
                                      txtStatus.Text = "Cancelled"
                                      txtCalmDown.Text = ""
                                      btnToggleScan.Image = Image.FromFile(Application.StartupPath & "/res/malware_scanner/rocket.png")
                                  End Sub, MethodInvoker))
            Catch ex As Exception : End Try
        Else
            Exit Sub
        End If
    End Sub

Пробные решения

Я пробовал следующие решения,но ничего не помогло:

Пытался проверить отмену внутри события DoWork

Private Sub bgWorker_Scanner_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgWorker_Scanner.DoWork
    If bgWorker_Scanner.CancellationPending = True Then
        e.CancelAsync()
        bgWorker_Scanner.dispose()
    End If
End Sub

Пытался проверить отмену и собрать мусор

Private Sub bgWorker_Scanner_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgWorker_Scanner.DoWork
    If bgWorker_Scanner.CancellationPending = True Then
        e.CancelAsync()
        bgWorker_Scanner.dispose()
        GC.Collect()
    End If
End Sub

Пытался сделать выше в инструкциях Try-Catch

Private Sub bgWorker_Scanner_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgWorker_Scanner.DoWork
    If bgWorker_Scanner.CancellationPending = True Then
        If bgWorker_Scanner.IsBusy Then
            Try
                e.CancelAsync()
                bgWorker_Scanner.dispose()
                GC.Collect()
            Catch ex As Exception
                MsgBox(ex.Message.ToString)
        End If
    End If
End Sub

Debug Image

Есть ли способзавершить работу фонового работника без полного закрытия формы?Любая помощь приветствуется.

...