Логика программы
Я работаю в фоновом режиме для чтения и записи файлов.Для проверки нажатия кнопки отмены я создал метод с именем "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
Есть ли способзавершить работу фонового работника без полного закрытия формы?Любая помощь приветствуется.