Как определить, что процесс принудительно закрыт (WaitForExit) запущен? - PullRequest
3 голосов
/ 29 июня 2011

Я звоню в ffmpeg.Иногда вызов завершается неудачно, и ffmpeg не завершает работу, он просто входит в рекурсивный цикл.Я вызвал метод WaitForExit.

Далее в коде я опрашиваю standardOutput и standardError.Я знаю, что когда ffmpeg не завершает работу, на экране консоли появляется много мусора.По этой причине я верю, что когда я пытаюсь получить standardOutput и standardError, код c # просто падает.Это все еще пишется.Как я могу сказать, что c # вышел из кода как rathar, а не сам процесс?

Я пытался посмотреть на process.HasExited, но он не работает.Хотя я знаю, что c # вышел из процесса, он все равно выглядит как ложное.

            p.StartInfo.FileName = exePathArg;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.Arguments = argumentsArg;
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.CreateNoWindow = true;

            p.Start();

            p.WaitForExit(timeToWaitForProcessToExit);

            StreamReader standardOutput = p.StandardOutput;
            StreamReader standardError = p.StandardError;

            retDirects.Add("StandardOutput", standardOutput.ReadToEnd());
            retDirects.Add("StandardError", standardError.ReadToEnd());

1 Ответ

2 голосов
/ 29 июня 2011

Вы не сможете узнать, если процесс не предоставит какой-либо вывод или код ошибки.Вы можете посмотреть на ExitCode, используя:

p.ExitCode

Код ошибки предоставляется приложением, поэтому вам также нужно знать, какие значения оно может вернуть.

В некоторых случаях, если процесс завершен (например, через диспетчер задач, ExitCode может быть равен 1, см. этот ответ ).

Обновление

После нашего обмена комментариями кажется, что нужно решить еще несколько вопросов:

Если вы уверены, что процесс на самом деле не отвечает, то его уничтожение является хорошим последнимкурорт.Существует два способа «убить» процесс с помощью класса Process:

  • Process.Kill() - завершить процесс (и, возможно, повредить данные)
  • Process.CloseMainWindow() - отправляет сообщение о закрытии в главное окно (только для графического интерфейса)

Если у вас есть процесс с графическим интерфейсом, вы должны использовать CloseMainWindow().CloseMainWindow() - это, по сути, то же самое, что нажатие кнопки выхода в окне, поэтому оно безопаснее, потому что на самом деле просит программу выключиться.Обратите внимание, что процесс может на самом деле не отвечать на CloseMainWindow, либо потому, что он не отвечает, либо потому, что он отказывается, так что, возможно, вам придется использовать Kill() впоследствии, если это произойдет.

Если у вашего процесса нет графического интерфейса, Kill() - единственный способ сделать это.

Однако, как вы спросили в комментариях об использовании обоих, вы не должныделайте это, если вы не пытаетесь использовать CloseMainWindow(), и это не сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...