所以我目前正在使用 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/