如何一次异步读取标准输出流和标准错误流

Mar*_*cka 17 .net c# process

我想在控制台中读取表单中的进程输出(标准输出与一个流中的标准错误混合).有办法怎么做?

我正在考虑使用

ProcessStartInfo.UseShellExecute = true;  
Run Code Online (Sandbox Code Playgroud)

但后来我无法异步读取输出.如果我订

process.ProcessStartInfo.UseShellExecute = false;  
process.StartInfo.RedirectStandardOutput = true;
process.OutputDataReceived += new DataReceivedEventHandler(partialOutputHandler);
Run Code Online (Sandbox Code Playgroud)

然后我可以读标准输出(我可以做同样的标准错误)但我不知道如何模拟控制台的行为(混合stdout和stderr).

注意:我知道Linux具有将标准错误流重定向到标准输出流的功能,但我无法将其用于.NET.

我必须错过一些非常简单的事情

谢谢!

Oha*_*der 43

你的意思是这样的吗?

SynchronizationContext _syncContext;
MyForm()
{
    _syncContext = SynchronizationContext.Current;
}

void StartProcess()
{
    using (var process = new Process
        {
            StartInfo = new ProcessStartInfo
            {
                FileName = "myProcess.exe",
                UseShellExecute = false,
                RedirectStandardOutput = true,
                RedirectStandardError = true,
            }
        })
    {
        process.OutputDataReceived += (sender, args) => Display(args.Data);
        process.ErrorDataReceived += (sender, args) => Display(args.Data);

        process.Start();
        process.BeginOutputReadLine();
        process.BeginErrorReadLine();

        process.WaitForExit(); //you need this in order to flush the output buffer
    }   
}

void Display(string output)
{
    _syncContext.Post(_ => myTextBox.AppendText(output), null);
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*cka 3

我找到了答案:

输出流被缓冲。无法获得插入流中的项目的真实顺序。事实上,这没有什么意义,因为两个流也可以同时写入。它们是相互独立的。因此,您能做的最好的事情就是在每个到达时获取它们的顺序输出。

一般来说,这不是问题,因为几乎所有控制台应用程序都使用标准输出来输出和错误消息。某些应用程序使用错误流,但消息通常是输出流中生成的错误的重复。

来源: http://social.msdn.microsoft.com/Forums/uk/csharpgeneral/thread/192b6df7-9437-42cf-81c1-c125021735ba

  • 嗯,这不是你原来问题的答案。 (2认同)