process.start замораживание моего приложения (VS 2013)
Поэтому я пытаюсь создать приложение, которое запускает сторонний exe-файл для выполнения некоторых файловых операций на основе списка имен файлов. Поэтому, если в списке 13 элементов, я прохожу цикл 13 раз, каждый раз запуская внешний процесс, уведомляя пользователя о том, какой файл обрабатывается прямо сейчас, запуская процесс и ожидая его завершения. Чтобы уведомить пользователя, другой список используется в качестве окна. Проблема в том, что.waitforexit() каким-то образом странным образом замораживает весь поток, так что внешняя программа называется nmormaly, файлы обычно обрабатываются, но главное окно останавливается до тех пор, пока все элементы не будут выполнены. Таким образом, в основном Shoutbox заморожен и получает спам со всей информацией только после завершения всего цикла. Я пробовал множество способов реализовать это, таких как запуск новых потоков, использование пула потоков, таймеров и еще много чего. Любая помощь приветствуется. код:
Imports System.Windows.Threading
Imports System.Windows.Forms
Imports System.IO
Imports System.Threading
If Listbox2.Items.Count > 0 Then
tabctrl.SelectedIndex = 2
Listbox3.Items.Add(DateTime.Now.ToString & ": Process initiated.")
For i = 0 To Listbox2.Items.Count - 1
Listbox3.Items.Add(DateTime.Now.ToString & ": Processing :" & Listbox1.Items.Item(i))
If System.IO.File.Exists(Listbox2.Items.Item(i)) = False Then
Dim pInfo As New ProcessStartInfo()
With pInfo
.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden
.FileName = System.IO.Directory.GetCurrentDirectory & "\" & "myapp.exe"
.argouments = "w/e"
End With
Dim p As Process = Process.Start(pInfo)
p.WaitForExit()
p.Dispose()
Else
Listbox3.Items.Add(DateTime.Now.ToString & ":! " & Listbox2.Items.Item(i) & " already exists. Moving to next file..")
End If
Next
Listbox3.Items.Add("*-*")
Listbox3.Items.Add(DateTime.Now.ToString & ": Done.")
End If
1 ответ
Проблема в том, что вы (по крайней мере, в коде, который вы разместили) звоните WaitForExit()
в потоке пользовательского интерфейса. Поток пользовательского интерфейса отвечает за перерисовку окна, поэтому, если вы заблокируете его, вызвав WaitForExit()
например, он не перерисовывает интерфейс, и приложение кажется замороженным.
Вам нужно вызвать его в другом потоке или в пуле потоков, я рекомендую использовать Задачи:
Task.Run( Sub()
Dim p As Process = Process.Start(pInfo)
p.WaitForExit()
End Sub)
Однако, поскольку вы ничего не делаете с результатами Process.Start()
Звоните, вы также можете считать не звонить WaitForExit()
совсем.
Поскольку вы используете VS2013, вы также можете использовать оператор ожидания, чтобы дождаться завершения процесса:
await Task.Run( Sub()
Dim p As Process = Process.Start(pInfo)
p.WaitForExit()
End Sub)
Обратите внимание, что вы также должны добавить async
ключевое слово для окружающего метода, а также