在我的程序中,我生成一个进程,然后一次读取它的标准输出一个字符,如下所示:
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()。
注意:我不能使用进程事件,因为我一次需要一个字符(不是整个字符串),捕获取决于输入字符。
发布于 2019-09-16 12:16:50
您还可以考虑重定向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);
}https://stackoverflow.com/questions/57956500
复制相似问题