Process.Kill не убивая процесс - PullRequest
       3

Process.Kill не убивая процесс

2 голосов
/ 31 августа 2011

Я написал некоторый код для взаимодействия с консольным приложением, которое регулярно зависает (из-за глючного взаимодействия COM я не могу контролировать).Мой метод включает в себя вызов Process.Kill() после истечения времени ожидания, но, похоже, он не убивает процесс - он все еще появляется в диспетчере задач.Что-то не так с этим кодом?

private static string CallBuggyConsoleApp(string path, string ext) {
    var startInfo = new ProcessStartInfo {
        FileName = ConsoleAppPath,
        Arguments = String.Format("\"{0}\" {1}", path, ext),
        UseShellExecute = false,
        RedirectStandardOutput = true,
        RedirectStandardError = true
    };
    using (var proc = Process.Start(startInfo)) {
        //The line above should be replaced with:
        //using (var proc = new Process()) {
        //    proc.StartInfo = startInfo;
        var output = new StringBuilder();
        var error = new StringBuilder();
        proc.OutputDataReceived += (_, args) => output.Append(args.Data);
        proc.ErrorDataReceived += (_, args) => error.Append(args.Data);
        proc.Start();
        proc.BeginOutputReadLine();
        proc.BeginErrorReadLine();
        if (proc.WaitForExit((int)ConsoleAppTimeout.TotalMilliseconds)) {
            proc.WaitForExit();
            if (proc.ExitCode != 0) {
                throw new Exception(String.Format("Pid {0} exited at {1} with exit code {2} and the following error: {3}",
                    proc.Id, proc.ExitTime, proc.ExitCode, error.ToString()));
            }
            return output.ToString();
        }
        proc.CancelOutputRead();
        proc.CancelErrorRead();
        proc.Kill();
        proc.WaitForExit();
        throw new Exception(String.Format("Killed pid {0} at {1}", proc.Id, proc.ExitTime));
    }
}

1 Ответ

2 голосов
/ 31 августа 2011

во внутренней части кода, где вы делаете первый бросок, который вы не вызываете Kill.

в общем случае Exception не следует использовать в бросках, более обычно бросать некоторыепроизводные классы, такие как ApplicationException или другие, более специализированные.

Кроме этого, почему вы вызываете start дважды?Как бы он себя вел, вызывая старт только один раз?Видите ли вы разницу?

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