Синхронизация между двумя процессами в C#

#c# #wpf

#c# #wpf

Вопрос:

У меня есть приложение WPF, при нажатии кнопки я запускаю 2 процесса (P1 и P2), оба выполняются по команде propmt, и я могу перенаправить вывод обоих процессов в текстовое поле в моем приложении WPF. (считывание выходных данных в асинхронном режиме).

Но результат смешивается, потому что я не выполняю WaitForProcess ни для P1, ни для P2 (я не хочу, чтобы пользовательский интерфейс зависал). Я хочу, чтобы P2 запускался после завершения P1.

Для этого я проверяю, существует ли процесс P1 или нет, а затем запускаю только процесс P2. Но мой пользовательский интерфейс зависает, и ничего не происходит.

на панели задач Windows процесс P1 запущен, но текстовое поле не обновляется.

Ответ №1:

Когда вы инициализируете Process объект, вы можете зарегистрировать обработчик для Process.Exited события. Как вы можете себе представить, это событие возникает, когда соответствующий процесс завершается, так что вы можете начать свой второй Process оттуда:

 Process process = new Process();
process.EnableRaisingEvents = true;
...
process.Exited  = Process_Exited;
  

 private void Process_Exited(object sender, EventArgs e)
{
    // First Process has completed - start second process here
}
  

Комментарии:

1. Не забудьте установить для EnableRaisingEvents значение true

2. @Sheridan, спасибо за помощь, добавил EnableRaisingEvents в true и зарегистрировал обработчик exited, но событие exited не запускается. 🙁

3. Спасибо, @rene… по-видимому, я случайно удалил слишком много ненужного кода… тогда не все не имеет значения.

4. Извините @atulya, это не в моей власти. Это обычный способ справиться с этой ситуацией. Я полагаю, что вы могли бы потенциально принять к сведению идентификатор процесса и использовать a DispatcherTimer , чтобы проверить, работает ли он по-прежнему через регулярные промежутки времени.

5. есть обходной путь — я выводил вывод консоли в текстовое поле, поэтому я добавил фильтр для некоторой строки, когда процесс P1 будет завершен.