如何在一段时间后强行关闭c#中的进程?

时间:2011-12-01 19:08:37

标签: c# .net process

我收到了以下代码

    System.Diagnostics.Process capp = new System.Diagnostics.Process();
    capp.StartInfo.UseShellExecute = false;
    capp.StartInfo.RedirectStandardOutput = true; 
    capp.StartInfo.RedirectStandardError = true;
    capp.EnableRaisingEvents = false;
    capp.StartInfo.FileName = "app.exe";
    capp.StartInfo.Arguments = "-i -v -mj";
    capp.Start();

    consoleOutput = capp.StandardOutput.ReadToEnd() + capp.StandardError.ReadToEnd();
    if (!capp.WaitForExit(10000)) capp.Kill(); 

和问题,如果外部应用程序正常工作,它完成任务所需的时间不到10秒。如果因为某些原因停止/挂起,尽管使用

    if (!capp.WaitForExit(10000)) capp.Kill(); 

正如其他一些主题所建议的,它一直在努力。在我的情况下,上面的行似乎根本不起作用,我想这与我读过StandardOutput和StandardError的事实有关。如何修复我的代码以使读取输出和WaitForExit()无处不在?

1 个答案:

答案 0 :(得分:4)

如果您不总是从 StandardOutputStandardError读取,则缓冲区可以填充,从而导致进程被阻止。

您首先尝试阅读StandardOutput到最后。您运行的进程可能会将大量数据写入StandardError,直到它阻塞并且无法写入更多内容。然后,这会导致您的应用程序阻塞,因为它甚至不会从StandardError开始读取,直到该进程关闭其StandardOutput。这会造成死锁,两个进程都不会继续。

我建议您使用我发布的解决方案here。它使用异步读取从StandardOutputStandardError读取,避免死锁。