vb.net - 移动文件时表单卡住

标签 vb.net winforms visual-studio-2010 filesystems backgroundworker

所以我目前正在使用 BackgroundWorker1_DoWork 来创建 PDF 文件。在 BackgroundWorker1RunWorker1_Completed 上,我使用以下代码将这些文件从一个位置移动到另一个位置。

        'MOVE PDFs TO NEW LOCATION
        For Each foundFile As String In My.Computer.FileSystem.GetFiles("C:\Temp\", FileIO.SearchOption.SearchAllSubDirectories, "*.pdf")
            Dim foundFileInfo As New System.IO.FileInfo(foundFile)
            'ToolStripStatusLabel1.Text = "Moving PDFs..."
            File.Move(foundFile, "\\server\temp\" & foundFileInfo.Name) 'MOVES PDFs
        Next

当程序到达此点时,我的表单卡住,无法移动窗口,无法滚动,无法在程序中执行任何操作。

什么会导致我的表单卡住?有什么办法可以消除这种情况吗?

最佳答案

Completed 事件是从 UI 线程引发的。因此,您在该事件处理程序中执行的任何工作都将阻塞 UI,直到处理完成。如果您不想导致 UI 卡住,则需要在 DoWork 事件处理程序中执行 File.Move,因为这是从后台线程。

更新

根据上面的评论,您需要记住 DoWork 事件处理程序是从后台线程引发的。因此,您可以根据需要阻塞该线程,而不会影响 UI 响应能力。因此,如果您遇到进程退出后文件不可用的问题,我建议您在循环中重试 File.Move。您可以多次重试文件移动操作,中间有一个短暂的 Thread.Sleep ,这样如果在一段时间后仍然失败,它将超时并失败。例如,这将每秒重试一次文件,然后在 10 秒后超时:

For i As Integer = 0 To 10
    Try
        File.Move(foundFile, "\\server\temp\" & foundFileInfo.Name)
        Exit For
    Catch ex As IOException
    End Try
    Thread.Sleep(1000)
Next

关于vb.net - 移动文件时表单卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21004296/

相关文章:

.net - Vb.net 两个逗号分隔的列表

c# - 通知用户无效输入的常见做法是什么?

c# - 包含组合框窗口窗体的组合框项

c# - 如何使用 C# 清除 Windows 应用程序中的 datetimepicker 值?

asp.net - WCF 远程调试符号的位置

visual-studio-2010 - Nuget Clean 软件包删除/安装

javascript - 每当发生回发时都需要从 .aspx (VB.net) 页面调用 Javascript 函数

wpf - VB.NET 2008 的加载程序锁定错误(仅限 Windows XP?)

vb.net - 在哪里处理非模态形式的实例

visual-studio-2010 - 无法获取 Mat 的列数和行数