我打电话给ffmpeg。有时调用失败并且ffmpeg不会退出它只会进入一个递归循环。我已经调用了WaitForExit方法。
在代码中,我正在询问standardOutput和standardError。我知道当ffmpeg没有退出时,它会在控制台屏幕上产生大量垃圾。出于这个原因,我相信当我尝试获得standardOutput和standardError时,c#代码就会崩溃。它仍然被写入。我如何判断c#是否已经退出代码rathar而不是自己退出的进程?
我试图查看process.HasExited但它不起作用。即使我知道c#退出了这个过程,它仍然是错误的。
p.StartInfo.FileName = exePathArg;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.Arguments = argumentsArg;
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.Start();
p.WaitForExit(timeToWaitForProcessToExit);
StreamReader standardOutput = p.StandardOutput;
StreamReader standardError = p.StandardError;
retDirects.Add("StandardOutput", standardOutput.ReadToEnd());
retDirects.Add("StandardError", standardError.ReadToEnd());
答案 0 :(得分:2)
除非进程提供某种输出或错误代码,否则您可能无法判断。您可以使用以下命令查看ExitCode:
p.ExitCode
错误代码由应用程序提供,因此您还必须知道它可能返回的值。
在某些情况下,如果进程被终止(例如通过任务管理器,则ExitCode可能为1,请参阅this answer)。
<强>更新强>
在评论中交换之后,似乎还有其他一些问题需要解决:
如果您确信该过程实际上处于无响应状态,则终止该过程是一个不错的最后手段。使用Process
类“杀死”进程有两种方法:
Process.Kill()
- 终止进程(可能还有损坏的数据)Process.CloseMainWindow()
- 向主窗口发送关闭消息(仅GUI处理)如果您的进程具有图形界面,则应使用CloseMainWindow()
。 CloseMainWindow()
与单击窗口上的退出按钮基本相同,因此它更安全,因为它实际上要求程序自行关闭。请注意,该过程可能实际上不会响应CloseMainWindow
,因为它没有响应或者因为它没有选择,所以如果发生这种情况,您可能不得不在之后使用Kill()
。
如果您的流程没有图形界面,Kill()
是唯一的方法。
但是,正如您在评论中提到的那样,除非您尝试使用CloseMainWindow()
并且不起作用,否则不应该这样做。