首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从stdout或stderr异步读取

从stdout或stderr异步读取
EN

Stack Overflow用户
提问于 2019-09-16 12:03:52
回答 1查看 172关注 0票数 0

在我的程序中,我生成一个进程,然后一次读取它的标准输出一个字符,如下所示:

代码语言:javascript
复制
char[] c = new char[1];
while (true)
{
  await targetProcess.StandardOutput.ReadAsync(c, 0, 1);
  // use c[0] here
}

这种读取取决于上面没有显示的一些事情(如果语句)。现在,在某些情况下,我想要做的是阅读StandardOutputStandardError,所以实际上我想要这样的东西

代码语言:javascript
复制
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()

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

EN

回答 1

Stack Overflow用户

发布于 2019-09-16 12:16:50

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

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57956500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档