表单在移动文件时冻结

时间:2014-01-08 19:02:09

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

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

        '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

当程序到达这一点时,我的表单冻结,无法移动窗口,无法滚动,无法在程序内做任何事情。

什么会导致我的表格冻结?有没有办法消除这个?

1 个答案:

答案 0 :(得分:4)

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

<强>更新

根据您上面的评论,您需要记住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