стандартный вывод паузы в конце потока C # - PullRequest
2 голосов
/ 07 мая 2011

Я читаю вывод приложения java, запущенного с помощью Process, и читаю 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-приложение иногда возвращает строку, даже если нет ввода, поэтому мне всегда нужно проверять новую строку.но если мне нужно отправить команду, а новых выходных данных нет, она не будет отправлена.

Я пробовал разные операторы If на readline, но он возвращал только первые несколько строк, тогда он останавливался

По сути, кажется, что он приостанавливает цикл, если для него нет новой строки для чтения.

Как я могу либо настроить свой цикл чтения / записи по-другому, либо заставить цикл отменить паузу?

Спасибо, Адам

Ответы [ 2 ]

0 голосов
/ 06 июня 2012

Обратите внимание, что если вы пытаетесь получить доступ к выводу после CancelOutputRead () и CancelErrorRead (), вы можете обнаружить, что иногда вам не хватает некоторого текста.Я обнаружил, что сброс происходит только после явного вызова Close ().Удаление (с помощью оператора using) не помогает.

Этот признак, скорее всего, будет возникать при вызове командного процессора (CMD.EXE), поскольку он не сбрасывает сам себя.Поэтому будьте осторожны, чтобы не пытаться получить доступ к выводу (записанному из ваших обработчиков событий), если вы сначала явно не вызвали Close ().

0 голосов
/ 07 мая 2011

попробуйте это:

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);
    }
}
...