2

Так что я сейчас использую 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 

Когда программа доходит до этой точки, моя форма застывает, не может переместить окно, не прокручивать, ничего в рамках программы не может сделать.

Что заставило бы мою форму заморозить? Есть ли способ устранить это?

+1

Почему бы вам не поместить этот код в событие RunWorkerCompleted? Поместите его в обработчик событий DoWork. –

+0

Почему бы просто не перемещать файлы в фоновом режиме? –

+0

Я использую для каждого statmement в DoWork для создания PDF-файлов. У меня возникла проблема, ожидающая завершения этого процесса, прежде чем продолжить. Несмотря на то, что я использую 'psinfo.WaitForExit()', я не понял, почему и, следовательно, любой код после того, как мой For Each работает до того, как файлы будут полностью созданы. Вот почему я решил переместить PDF-файлы после завершения DoWork. – Muhnamana

ответ

4

Событие Completed связано с потоком пользовательского интерфейса. Поэтому любая работа, которую вы выполняете в этом обработчике событий, блокирует пользовательский интерфейс, пока он не будет обработан. Если вы не хотите, чтобы пользовательский интерфейс зависал, вам нужно сделать File.Move в обработчике событий DoWork, так как это тот, который поднят из фонового потока.

Update

Основываясь на ваш комментарий выше, вы должны помнить, что обработчик DoWork события вызываются из фонового потока. Поэтому вы можете блокировать этот поток столько, сколько хотите, не влияя на отзывчивость пользовательского интерфейса. Поэтому, если у вас возникла проблема с тем, что файл еще не доступен после завершения процесса, я бы рекомендовал повторить попытку 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 
+0

@Muhnamana, я скучаю по твоему старому muppet pic :) –

+1

Я верну его обратно ... он хорошо связан с моим именем пользователя! :) – Muhnamana

+0

Этот тайм-аут 10 секунд, если PDF-файлы создаются после этих 10 секунд, они не будут исправлены? Таким образом, поиск оптимального тайм-аута оправдан? – Muhnamana

Смежные вопросы