从stdout或stderr异步读取

时间:2019-09-16 12:03:52

标签: c# process io stdout stderr

在我的程序中,我生成一个进程,然后一次按如下方式读取其标准输出:

char[] c = new char[1];
while (true)
{
  await targetProcess.StandardOutput.ReadAsync(c, 0, 1);
  // use c[0] here
}

此读取取决于上面未显示的许多内容(如果有语句)。现在,在某些情况下,我想读的是 StandardOutput StandardError,所以我实际上想要的是

async Task ReadFromRightStream()
{
  if (targetProcess.StandardError.Peek() != -1)
    await targetProcess.StandardError.ReadAsync(c, 0, 1);
  else await targetProcess.StandardOutput.ReadAsync(c, 0, 1);
}

但是上面的代码只是在Peek()上阻塞。理想情况下,我想将两个流合并为一个流,然后在其上ReadAsync()

注意:我不能使用流程事件,因为我一次只需要一个字符(而不是整个字符串),并且捕获取决于输入字符。

1 个答案:

答案 0 :(得分:0)

您还可以考虑重定向stdout和stderr。当数据发送到输出或错误时,将触发一个事件。您还可以使用相同的方法来处理两个事件。

void Method()
{
    var startInfo = new ProcessStartInfo()
    {
        FileName = ...,
        Arguments = ...,
        RedirectStandardOutput = true,
        RedirectStandardError = true,
        UseShellExecute = false
    };

    var process = new Process()
    {
        StartInfo = startInfo
    };

    process.OutputDataReceived += ProcessOutputHandler;
    process.ErrorDataReceived += ProcessOutputHandler;

    process.BeginOutputReadLine();
    process.BeginErrorReadLine();
}

private void OnProcessOutputReceived(object sender, DataReceivedEventArgs e)
{
    OutputMessage(e.Data);
}