gpt4 book ai didi

C# StandardOutput 挂起,如何检测它正在等待输入?

转载 作者:太空宇宙 更新时间:2023-11-03 10:31:50 24 4
gpt4 key购买 nike

我使用 C# 处理进程(使用 Process 和 ProcessStartInfo)已经有一段时间了。现在只有一个问题一直困扰着我,一直没有找到解决的办法。

当应用程序“等待”某些输入时,StandardOutput 将挂起。这意味着,如果您使用的是 ReadToEnd,它将永远不会返回(因为实际的输入窗口是不可见的)。

现在,当我使用 StandardInput 提供输入时,这会产生问题。例如:

  1. 使用 C# 启动进程
  2. 使用 StandardInput 输入命令。
  3. 开始读取输出流。
  4. 根据上次输出运行另一个。

现在这就是问题所在:我无法判断进程是在等待输入还是仍在生成输入,因为我的进程“卡住”以从 StandardOutput 读取(它在同一个线程上完成)。

我需要在我的命令运行后读取输出,运行一些算法,然后根据之前的命令输出运行另一个命令。

有什么方法可以检测正在运行的进程是否完成加载我的命令并等待新输入?就像 cmd 一样?

最佳答案

按照 Peter 的回答,我没有在 StandardOutput 的末尾找到任何特殊的定界符(我也检查了 ErrorOutput)。

想到这里我就想,为什么不用echo来“模拟”一个定界符呢?所以我放了这段代码,它允许我运行一个特定的命令并立即在同一个线程上获得输出:

    /// <summary>
/// A string used to write into the bash and allows us to detect when the bash finished to write it's output.
/// </summary>
const string delimiterString = "#WAITING";

/// <summary>
/// Runs the specified command and return it's output.
/// </summary>
/// <param name="command"></param>
/// <returns></returns>
public string RunCommand(string command)
{
sessionProcess.StandardInput.WriteLine(command);

// Add a special string to be recognized when output is waiting
sessionProcess.StandardInput.WriteLine("echo \"" + delimiterString + "\"");

string output = "";
int lastChr = 0;

do
{
lastChr = sessionProcess.StandardOutput.Read();

string outputChr = null;
outputChr += sessionProcess.StandardOutput.CurrentEncoding.GetString(new byte[] { (byte)lastChr });
output += outputChr;

if (output.EndsWith(delimiterString))
{
// Remove delimeter
output = output.Replace(Environment.NewLine + delimiterString, "");
output = output.Replace(delimiterString + Environment.NewLine, "");

// Console.Write(output);
break;
}

} while (lastChr > 0);

return output;
}

关于C# StandardOutput 挂起,如何检测它正在等待输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29829028/

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