Выполнение системной команды асинхронно без блокировки пользовательского интерфейса и принудительное завершение процесса - PullRequest
0 голосов
/ 18 февраля 2012

У меня есть приложение WPF на C #, и мне нужно выполнить системную команду, которая никогда не существует (потому что она ждет от вас нажатия Q).Я хочу принудительно завершить его после того, как получу вывод в первый раз, и я также не хочу блокировать пользовательский интерфейс WPF, поэтому я хочу сделать это асинхронно (я считаю, что потоки усложнят ситуацию).

Этото, что у меня сейчас есть:

System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/C " + command;
process.StartInfo = startInfo;
process.Start();
process.WaitForExit();

Приведенный выше код имеет 2 проблемы: он блокирует пользовательский интерфейс и никогда не получает вывод (процесс не завершится).

Примечание: я использовалWaitForExit() потому что мне нужен вывод перед продолжением.

1 Ответ

1 голос
/ 18 февраля 2012
  1. Используйте BackgroundWorker Class для запуска процесса в отдельном потоке.Это предотвратит блокирование пользовательского интерфейса.
  2. Взгляните на Process.OutputDataReceived Event , которое происходит, когда приложение выполняет запись в перенаправленный поток StandardOutput.Таким образом, вывод может быть взят, даже если процесс не остановлен.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...