【问题标题】:Force Background worker to End强制后台工作人员结束
【发布时间】:2014-07-14 13:01:59
【问题描述】:

我创建了一个带有进程的应用。如果用户在进程繁忙时尝试关闭表单,则会提示他们并询问他们是要等待还是结束。如果他们选择等待,则在 BGW 中设置并检查取消标志,该标志将在当前任务之后结束。

问题是如果他们仍然喜欢结束如何处理。我的过程是压缩文件。如果进程在一个大 zip 上并且用户不想等待,那么我需要杀死 BGW 然后清理,即删除不完整的 zip 文件。我写了这个:

Else
    ' If cancel selected...
    ' Forces backup to end.
     ???
     ' Deletes incomplete backup.
     If My.Computer.FileSystem.FileExists(currentBackup1) Then
         My.Computer.FileSystem.DeleteFile(currentBackup1)
     End If
End If

我已尝试在我的表单关闭子中删除该文件,但 BGW 仍然可以访问,并且我有一个异常,即该文件正在使用中。因此,要么我需要终止 BGW,要么能够在表单关闭之前删除正在使用的文件。有人可以帮忙吗?谢谢。

【问题讨论】:

  • 要取消的代码在哪里,或者这就是您要查找的代码?
  • 这就是我要找的。我已经在使用 BGW.CancelAsync() 来提高 BGW 中的取消标志并在当前循环后退出。但是要强行退出,如果要关闭程序,也许不要等待很长的zip。现在我知道 me.close() 会做到这一点...但是如果正在进行压缩,我希望有机会删除没有用的不完整的压缩文件。有什么想法吗?
  • 感谢您的回复。反正我还没用过catch,直到现在。但这只是允许程序在无法删除时无异常关闭,但我需要实际删除文件。
  • 因为 ZipFile 的粒度显然是目录,所以你有点卡住了。这可能是在替换 Lib 中寻找的东西 - 一种指定某些文件的方法,这样您就可以一次提供几个文件并在两者之间寻找取消标志。不过你是对的,直到应用程序结束你/NET/ZipFile 类已经打开并且你不能删除它。也许您可以从临时文件夹中工作并将成品移动到所需的位置;在启动时,您会删除那里的所有旧残余。

标签: vb.net multithreading backgroundworker


【解决方案1】:

您可以声明一个变量,如果该过程完成则返回 true。所以你可以这样尝试

Public Class MainForm
Public IsComplete As Boolean = False

Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    ' Your code comes here
    IsComplete = True
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    If IsComplete Then
        MsgBox("Completed successfully")
    Else
        If My.Computer.FileSystem.FileExists(currentBackup1) Then
            My.Computer.FileSystem.DeleteFile(currentBackup1)
        End If
    End If
End Sub 
End Class

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    相关资源
    最近更新 更多