C# 进程。杀死而不是杀死进程
我已经编写了一些代码来与一个经常挂起的控制台应用程序进行交互(由于我无法控制有bug的COM互操作)。我的方法包括在超时后调用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
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:很高兴知道。谢谢我没有太多地使用进程
,所以我担心我的代码有缺陷。