.net 后台工作进程取消异步不工作 程序逻辑

.net 后台工作进程取消异步不工作 程序逻辑,.net,vb.net,backgroundworker,.net,Vb.net,Backgroundworker,我正在运行一个后台工作程序来读取和写入文件。为了检查是否单击了cancel按钮,我创建了一个名为“check_bgWorkerCancelled()”的方法,如果cacellation挂起,该方法应该处理所有事件 问题 当我单击“取消”按钮时,工作进程将继续运行。当我单击“后退”开始按钮时,旧进程将继续运行 代码:用于检查取消 尝试过的解决方案 我尝试过以下解决方案,但没有一个有效: 试图在DoWork事件中检查取消情况 Private Sub bgWorker_Scanner_DoWork(s

我正在运行一个后台工作程序来读取和写入文件。为了检查是否单击了cancel按钮,我创建了一个名为“check_bgWorkerCancelled()”的方法,如果cacellation挂起,该方法应该处理所有事件

问题 当我单击“取消”按钮时,工作进程将继续运行。当我单击“后退”开始按钮时,旧进程将继续运行

代码:用于检查取消 尝试过的解决方案 我尝试过以下解决方案,但没有一个有效:

试图在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


有没有办法在不完全关闭表单的情况下结束后台工作程序?非常感谢您的帮助。

如果
bgWorker\u Scanner.CancellationPending,则“执行某些操作e.Cancel=True如果
,则结束”。从外部调用
[BackGroundWorker].CancelAsync()
。@Jimi我从一个按钮调用了
CancelAsync()
。由于某种原因,现在似乎出现了一个不同的问题。。有等待光标图标,默认情况下该按钮处于禁用状态。我没有设置这个,但我想Windows是自动设置的。。除非整个操作完成,否则我无法访问该按钮:'(您显然不知道如何正确使用
BackgroundWorker
。请继续学习。Post#19包含一个取消的示例。我希望您不要仍然试图在
DoWork
中处理BackgroundWorker,或调用
GC.Collect()
。如果在调用
CancelAsync
时处于循环中,请退出循环(在
e.Cancel=True
之后)。如果
bgWorker\u Scanner.CancellationPending,则“执行某些操作,e.Cancel=True End If
。从外部调用
[BackGroundWorker].CancelAsync()
。@Jimi我调用了
CancelAsync()
来自按钮。由于某种原因,现在似乎出现了另一个问题。.存在等待光标图标,默认情况下该按钮处于禁用状态。我没有设置此项,但我猜Windows会自动执行。.除非整个操作完成,否则我无法访问该按钮:'(您显然不知道如何正确使用
BackgroundWorker
。去学习。Post 19包含了一个取消的示例。我希望您不要仍然试图在
DoWork
中处理BackgroundWorker,也不要调用
GC.Collect()
。如果调用
CancelAsync
时处于循环中,请退出循环(在
e.Cancel=True之后)。
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