Процесс RedirectStandardOutput пуст, а DataReceivedEventArgs.Data имеет значение null.

При запуске приложения в режиме консоли в консоль записываются строки.

Теперь я хочу сделать это программно. Вот пример кода, который я использовал: MSDN для события OutputDataReceived

private static StringBuilder _sortOutput = null;

var proc = new Process();
                var info = new ProcessStartInfo();
            info.FileName = @"C:\SomeApp.exe";

            info.UseShellExecute = false;
            info.WindowStyle = ProcessWindowStyle.Normal;
            info.CreateNoWindow = false;

            proc.StartInfo = info;

            info.RedirectStandardOutput = true;
            info.RedirectStandardError = true;

            proc.OutputDataReceived += HandleOutputData;
            proc.ErrorDataReceived += HandleOutputData;

            proc.Start();
            proc.BeginOutputReadLine();
            proc.BeginErrorReadLine();

            proc.WaitForExit();

            var exitCode = proc.ExitCode;
            var output = _sortOutput.ToString();


    private void HandleOutputData(object sender, DataReceivedEventArgs e)
    {
        _sortOutput.Append(e.Data);
    }

Но DataReceivedEventArgs.Data всегда имеет значение null, и я не возвращаю результат, который я вижу в открывшемся окне консоли.

Как я могу получить вывод? Есть ли способ достичь этого?

ОБНОВИТЬ

Я также пытался прочитать proc.StandardOutput напрямую, но это не дает никаких данных.

3 ответа

Решение

Это ноль, потому что вы читаете данные в var outPut

Попробуйте следующее:

а) Изменить способ обращения с ним

proc.OutputDataReceived += new DataReceivedEventHandler(HandleOutputData);

б) Закомментируйте строку

//var outPut = proc.StandardOutput.ReadToEnd();

Как кто-то еще заметил, есть ошибка, где _sortOutput будет нулевым Но независимо от этого, вы совершенно правы: e.Data может и будет нулевым!

Фактически, ваш обработчик всегда должен вызываться с e.Data равно нулю, когда AsyncStreamReader, который выполняет вызов, достигает EOF стандартного перенаправляемого вывода - что произойдет, когда завершится запущенный вами процесс. Если, конечно, вы сначала не отменили регистрацию обработчика события OutputDataReceived или отменили асинхронное перенаправление вывода.

Нуль означает конец асинхронного потока. Вы должны и WaitForExit, и дождаться завершения завершающего нуля через e.Data

Другие вопросы по тегам