在我的程序中,我生成一个进程,然后一次按如下方式读取其标准输出:
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()
。
注意:我不能使用流程事件,因为我一次只需要一个字符(而不是整个字符串),并且捕获取决于输入字符。
答案 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);
}