Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 进程。杀死而不是杀死进程_C#_.net_Process - Fatal编程技术网

C# 进程。杀死而不是杀死进程

C# 进程。杀死而不是杀死进程,c#,.net,process,C#,.net,Process,我已经编写了一些代码来与一个经常挂起的控制台应用程序进行交互(由于我无法控制有bug的COM互操作)。我的方法包括在超时后调用Process.Kill(),但它似乎没有终止进程——它仍然出现在任务管理器中。这个代码有什么问题吗 private static string CallBuggyConsoleApp(string path, string ext) { var startInfo = new ProcessStartInfo { FileName = Conso

我已经编写了一些代码来与一个经常挂起的控制台应用程序进行交互(由于我无法控制有bug的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));
    }
}

在执行第一次抛出的代码内部,您没有调用
Kill

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


除此之外,你为什么要给start打两次电话?如果只启动一次,它将如何运行?你看到有什么不同吗?

为什么执行两次
proc.Start
?行
proc.Kill
是否真的执行(使用调试器检查)?这是什么类型的COM组件(COM/COM+/DCOM..)?您运行的是什么操作系统,进程提升了吗?啊,可能就是这样!我没有注意到我打了两次
Start
。更有可能的是,挂在周围的进程不是被杀死的进程。没问题。我也会尝试同样的代码,但启动另一个应用程序,比如notepad.exe,只是为了确保它在另一个可执行文件中按预期工作……这可能是个好主意。谢谢是的,删除对
Start
的另一个调用似乎已经解决了这个问题。我想我正在寻找一个构造函数,它接受
ProcessStartInfo
,最后调用了
Start
,却忘了它。在连接事件处理程序之后,我自动插入了对
Start
的第二个调用。注意,如果进程无法启动,Process.Start将返回null。@High:很高兴知道。谢谢我没有太多地使用
进程
,所以我担心我的代码有缺陷。