【问题标题】:How to tell if process was forced closed (WaitForExit) has been triggered?如何判断进程是否被强制关闭(WaitForExit)已被触发?
【发布时间】:2011-06-29 13:56:20
【问题描述】:

我正在调用 ffmpeg。有时调用失败并且ffmpeg不会退出它只会进入递归循环。我已经调用了 WaitForExit 方法。

在代码中,我进一步询问了standardOutput 和standardError。我知道当 ffmpeg 不退出时,它会在控制台屏幕上产生很多垃圾。出于这个原因,我相信当我尝试获取标准输出和标准错误时,c# 代码会崩溃。它仍在被写入。如何判断 c# 是否退出了代码而不是进程自行退出?

我试图查看 process.HasExited 但它不起作用。即使我知道 c# 已经退出进程,它仍然显示为 false。

            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());

【问题讨论】:

  • 它正在等待您在退出之前读取其输出。你做错了。

标签: c# process ffmpeg


【解决方案1】:

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

p.ExitCode

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

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

更新

经过我们在cmets的交流,似乎还有一些其他的问题需要解决:

如果您确信该进程实际上处于无响应状态,那么终止该进程是一个很好的最后手段。有两种方法可以用Process 类“杀死”一个进程:

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

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

但是,正如您在 cmets 中询问的有关同时使用这两种方法的问题,除非您尝试使用 CloseMainWindow() 并且不起作用,否则您不应该这样做。

【讨论】:

  • 好吧,我尝试访问 ExitCode 并引发错误。所以我想我可以把它包装在一个 try,catch 块中。遗憾的是这些类并没有更强大。我的意思是退出代码不应该仅仅因为被调用的进程失败而抛出错误。
  • InvalidOperationException : 进程必须退出才能确定请求的信息......猜这是因为进程进入的递归循环......!!!
  • 好的,现在我想我误解了你原来的场景。您希望 WaitForExit 表现如何?它实际上并没有尝试停止进程,它会等待进程自行退出。如果您提供超时,它将在该时间后返回,否则它将等待必要的时间。 Kill() 和 CloseMainWindow() 函数用于实际停止进程。
  • 哦,太好了,我不知道我能做到这一点,所以你是说我应该调用 WaitForExit(1000) 然后如果我检测到它卡在一个循环中,我应该调用 .Kill 和 .CloseMainWindow ?
猜你喜欢
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
  • 2017-03-29
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多