2011-12-01 35 views
3

我得到了下面的代码如何在一段时间后强制关闭c#中的进程?

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()一起工作?

回答

4

如果您不总是从读取StandardOutputStandardError缓冲区可以填充导致进程阻塞。

您首先尝试将StandardOutput读到最后。您运行的过程可能会将大量数据写入StandardError,直到它阻止并且无法写入更多。那么这导致应用程序被阻止,因为它甚至不从StandardError开始读取,直到过程关闭StandardOutput。这造成了僵局,这两个过程都不​​会继续。

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

+0

这工作非常好!谢谢! – MoreThanChaos