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 ключевое слово для окружающего метода, а также

Другие вопросы по тегам