作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我得到了以下代码
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() 工作在一旁?
最佳答案
如果您不总是从两者 StandardOutput
和StandardError
读取缓冲区可能会填满导致进程阻塞。
您首先尝试将 StandardOutput
读到最后。您运行的进程可能会向 StandardError
写入大量数据,直到它阻塞并且无法写入更多数据。然后,这会导致您的 应用程序阻塞,因为在进程关闭其StandardOutput
之前,它甚至不会从StandardError
开始读取。这会造成死锁,两个进程都不会继续。
我建议您使用我发布的解决方案 here .它使用异步读取从 StandardOutput
和 StandardError
读取,避免死锁。
关于c# - 如何在一段时间后强行关闭c#中的进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8346885/
我是一名优秀的程序员,十分优秀!