gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:41:26 25 4
gpt4 key购买 nike

我得到了以下代码

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

最佳答案

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

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

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

关于c# - 如何在一段时间后强行关闭c#中的进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8346885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com