【问题标题】:How to forcibly close Process in c# after some period of time?一段时间后如何强制关闭c#中的进程?
【发布时间】:2011-12-01 19:08:37
【问题描述】:

我得到以下代码

    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() 放在一边?

【问题讨论】:

    标签: c# .net process


    【解决方案1】:

    如果您不总是从 两个 StandardOutputStandardError 读取,缓冲区可能会填满,从而导致进程阻塞。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-05
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多