Как принудительно закрыть процесс в C # после некоторого периода времени? - PullRequest
3 голосов
/ 01 декабря 2011

Я получил следующий код

    System.Diagnostics.Process capp = new System.Diagnostics.Process();
    capp.StartInfo.UseShellExecute = false;
    capp.StartInfo.RedirectStandardOutput = true; 
    capp.StartInfo.RedirectStandardError = true;
    capp.EnableRaisingEvents = false;
    capp.StartInfo.FileName = "app.exe";
    capp.StartInfo.Arguments = "-i -v -mj";
    capp.Start();

    consoleOutput = capp.StandardOutput.ReadToEnd() + capp.StandardError.ReadToEnd();
    if (!capp.WaitForExit(10000)) capp.Kill(); 

и проблема в том, что если внешнее приложение работает правильно, ему требуется менее 10 секунд для выполнения своих задач.Если он остановился / завис по какой-то причине, несмотря на использование

    if (!capp.WaitForExit(10000)) capp.Kill(); 

, как предлагается в какой-то другой теме, он продолжает работать.Вышеупомянутая строка, кажется, не работает вообще в моем случае, я думаю, это связано с тем, что я прочитал StandardOutput и StandardError.Как исправить мой код, чтобы сделать чтение вывода и WaitForExit (), чтобы работать в стороне?

1 Ответ

4 голосов
/ 01 декабря 2011

Если вы не всегда читаете из обоих StandardOutput и StandardError буферы могут заполниться, вызывая процесс блокирования.

Сначала вы пытаетесь прочитать StandardOutput вконец.Процесс, который вы запускаете, может записывать много данных в StandardError, пока он не заблокируется и не сможет записать больше.Затем это приводит к блокировке вашего приложения, поскольку оно даже не начинает читать с StandardError до тех пор, пока процесс не закроет свой StandardOutput.Это создает тупик, и ни один процесс не будет продолжен.

Я предлагаю вам использовать решение, которое я разместил здесь .Он использует асинхронное чтение для чтения как StandardOutput, так и StandardError, избегая взаимоблокировок.

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