所以我目前正在使用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
当程序到达这一点时,我的表单冻结,无法移动窗口,无法滚动,无法在程序内做任何事情。
什么会导致我的表格冻结?有没有办法消除这个?
答案 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