c# - standardoutput 在流 C# 的末尾暂停循环

标签 c# loops streamreader redirectstandardoutput

我正在读取使用 Process 启动的 java 应用程序的输出,并读取 stdError、stdOutout 并使用 stdInput 发送命令。相关代码如下:

        int mem = Properties.Settings.Default.mem_max;
        string locale = Properties.Settings.Default.location;
        Process bukkit_jva = new Process();
        bukkit_jva.StartInfo.FileName = "java";
        //bukkit_jva.StartInfo.Arguments = "-Xmx" + mem + "M -Xms" + mem + "M -jar " + locale + "bukkit.jar";
        bukkit_jva.StartInfo.Arguments = "-Xmx512M -Xms512M -jar C:\\bukkit\\bukkit.jar";
        bukkit_jva.StartInfo.UseShellExecute = false;
        bukkit_jva.StartInfo.CreateNoWindow = true;
        bukkit_jva.StartInfo.RedirectStandardError = true;
        bukkit_jva.StartInfo.RedirectStandardOutput = true;
        bukkit_jva.StartInfo.RedirectStandardInput = true;
        bukkit_jva.Start();
        //start reading output
        SetText(bukkit_jva.StandardOutput.ReadLine());
        SetText(bukkit_jva.StandardOutput.ReadLine());
        SetText(bukkit_jva.StandardOutput.ReadLine());
        SetText(bukkit_jva.StandardOutput.ReadLine());
        StreamReader err = bukkit_jva.StandardError;
        StreamReader output = bukkit_jva.StandardOutput;
        StreamWriter writer = bukkit_jva.StandardInput;
        SetText(err.Peek().ToString());
        while (false == false)
        {
            if (vars.input != null)
            {
                writer.WriteLine(vars.input);
                vars.input = null;
            }
            SetText(output.ReadLine() + err.ReadLine());
        }
    }

SetText() 将行添加到行列表。

我的问题是即使没有输入,java 应用程序有时也会返回一个字符串,所以我总是需要检查换行。但是如果我需要发送一个命令,并且没有新的输出,它就不会发送。

我在 readline 上尝试了不同的 If 语句,但它只会返回前几行,然后就会停止。

基本上,如果没有新行可供读取,它似乎会暂停循环。

我怎样才能以不同的方式设置我的读/写循环或让循环取消暂停?

谢谢, 亚当

最佳答案

试试这个:

static void Main(string[] args)
{
    ProcessStartInfo psi = new ProcessStartInfo("echoApp.exe");
    psi.RedirectStandardInput = true;
    psi.RedirectStandardOutput = true;
    psi.RedirectStandardError = true;
    psi.UseShellExecute = false;

    Process echoApp = new Process();
    echoApp.ErrorDataReceived += new DataReceivedEventHandler(echoApp_ErrorDataReceived);
    echoApp.OutputDataReceived += new DataReceivedEventHandler(echoApp_OutputDataReceived);
    echoApp.StartInfo = psi;
    echoApp.Start();
    echoApp.BeginOutputReadLine();
    echoApp.BeginErrorReadLine();
    echoApp.StandardInput.AutoFlush = true;

    string str = "";
    while (str != "end")
    {
        str = Console.ReadLine();
        echoApp.StandardInput.WriteLine(str);
    }
    echoApp.CancelOutputRead();
    echoApp.CancelErrorRead();
    echoApp.Close();
}

static void echoApp_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    Console.WriteLine("stdout: {0}", e.Data);
}

static void echoApp_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
    Console.WriteLine("stderr: {0}", e.Data);
}

和小 echoApp...

//echoApp
static void Main(string[] args)
{
    string str="";
    while (str != "end")
    {
        str = Console.ReadLine();
        Console.WriteLine(str);
    }
}

关于c# - standardoutput 在流 C# 的末尾暂停循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5917464/

相关文章:

javascript - 从 For...in 循环插入函数?

ios - 进度条不会从 for 循环更新

java - Java 尝试判断字符串是否只包含字母

c# - 搜索 FileStream 然后使用 StreamReader 从那里读取

c# - 如何逐字阅读课文

c# - 如何获取 GridView 的 DataSource 中的记录数

c# - 尝试优化 MongoDB 的 I/O

c# - 我从哪里获得 x509 证书?

c# - 模拟没有接口(interface)或虚方法的类

c# - 如何以最有效的方式将图像转换为字符串?