如何判断进程是否被强制关闭(WaitForExit)?

时间:2011-06-29 13:56:20

标签: c# process ffmpeg

我打电话给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());

1 个答案:

答案 0 :(得分:2)

除非进程提供某种输出或错误代码,否则您可能无法判断。您可以使用以下命令查看ExitCode:

p.ExitCode

错误代码由应用程序提供,因此您还必须知道它可能返回的值。

在某些情况下,如果进程被终止(例如通过任务管理器,则ExitCode可能为1,请参阅this answer)。

<强>更新

在评论中交换之后,似乎还有其他一些问题需要解决:

如果您确信该过程实际上处于无响应状态,则终止该过程是一个不错的最后手段。使用Process类“杀死”进程有两种方法:

如果您的进程具有图形界面,则应使用CloseMainWindow()CloseMainWindow()与单击窗口上的退出按钮基本相同,因此它更安全,因为它实际上要求程序自行关闭。请注意,该过程可能实际上不会响应CloseMainWindow,因为它没有响应或者因为它没有选择,所以如果发生这种情况,您可能不得不在之后使用Kill()

如果您的流程没有图形界面,Kill()是唯一的方法。

但是,正如您在评论中提到的那样,除非您尝试使用CloseMainWindow()并且不起作用,否则不应该这样做。