进程RedirectStandardOutput为空,DataReceivedEventArgs.Data为null

时间:2013-03-12 12:06:24

标签: c# .net process redirectstandardoutput

在控制台模式下运行应用程序时,会有一些行写入控制台。

现在我想以编程方式执行此操作。以下是我使用的一些示例代码:MSDN on OutputDataReceived Event

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 个答案:

答案 0 :(得分:2)

正如其他人发现的那样,有一个错误_sortOutput将为空。但无论如何,你完全正确:e.Data可以并且将为空!

实际上,当执行调用的AsyncStreamReader到达正在重定向的标准输出的 EOF 时,应始终调用e.Data等于null的处理程序 - 这将发生当您运行的进程退出时。当然,除非您首先取消注册OutputDataReceived事件处理程序,否则取消异步输出重定向。

答案 1 :(得分:1)

它为空,因为您在var outPut

中读取数据

请尝试以下操作:

a)改变你的处理方式

proc.OutputDataReceived += new DataReceivedEventHandler(HandleOutputData);

b)注释掉

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

答案 2 :(得分:1)

Null表示异步流的结束。 您必须同时使用WaitForExit并等待终止null来通过e.Data