Process.Kill不会杀死进程

时间:2011-08-31 19:05:43

标签: c# .net process

我已经编写了一些代码来与定期挂起的控制台应用程序进行交互(由于我无法控制的错误的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 个答案:

答案 0 :(得分:2)

在您执行第一次投掷的代码的内部部分,您没有调用Kill

一般Exception不应该在throws中使用,更常见的是抛出一些派生类,如ApplicationException或其他更专业的派生类。

除此之外,你为什么要开始两次?如何只调用一次启动?你觉得有什么不同吗?