Как запустить процесс в l oop и дождаться его завершения, а затем снова запустить его в C# без зависания GUI - PullRequest
0 голосов
/ 07 мая 2020

Я новичок в программировании C#, и есть код, в котором я хочу несколько раз запустить процесс командной строки на al oop. Я также хочу дождаться завершения процесса командной строки, а затем снова запустить его с другими аргументами. Я определил этот процесс в al oop, и все работает нормально. Однако я также хочу обновлять индикатор выполнения на GUI каждый раз, когда процесс завершается, но в конечном итоге Process.WaitForExit () зависает от моего GUI и не обновляет индикатор выполнения. Индикатор выполнения обновляется, когда l oop завершается. Пожалуйста, помогите мне, вот что я пытался сделать.

ProcessStartInfo processInfox = new ProcessStartInfo();
processInfox.CreateNoWindow = false;
processInfox.UseShellExecute = false;
processInfox.FileName = programPath;
processInfox.CreateNoWindow = true;

int startFrames = Convert.ToInt16(txtStartFrame.Text);
int endFrames = Convert.ToInt16(txtEndFrame.Text);

for (int i = startFrames; i <= endFrames; i++)
{
    progressBar1.Value = (i / endFrames) * 100;
    iName = fileFrames + "_" + i + ".jpg";
    oName = outFrames + "\\" + outFileName + "_processed_" + i + ".jpg" ; 
    processInfox.Arguments = "-i \"" + iName + "\"" + progArgs + " -o \"" + oName + "\"";
    using (Process processFire = Process.Start(processInfox))
    {
        processFire.WaitForExit();
    }
}

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Поместите l oop в какую-нибудь функцию (назовем его foo) и используйте await Task.Run(foo) для запуска кода, который запускает процесс в фоновом потоке, не блокируя поток GUI.

async / await

Task.Run ()

0 голосов
/ 07 мая 2020
  1. Процесс предоставляет событие под названием Exited , вы можете подписаться на него. Не забудьте установить для свойства EnableRaisingEvents значение true. Подписка должна быть выполнена до процесса Start.
  2. Процесс может быть заморожен, поэтому выход никогда не сработает. Чтобы решить эту проблему, вы можете использовать шаблон timeout & kill . WaitForExit принимает int , который представляет собой тайм-аут в миллисекундах. Затем вы должны проверить свойство HasExited , если оно false, тогда вызовите метод Kill .
  3. В зависимости от ваших требований вы можете использовать фоновый поток для охватить процесс. Вы можете использовать new Thread, ThreadPool.QueueUserWorkItem или Task.Run или ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...