无缓冲版本的Process.BeginOutputReadLine方法

时间:2014-12-12 14:55:32

标签: c# .net asynchronous io io-redirection

某些控制台应用程序(如plink)在打印重要信息后可能无法打印换行符(例如“将密钥存储在缓存中?(y / n)”)。是否有内置的方法来异步读取不等待新行的程序标准输出?如果没有,是创建一个单独的线程来同步读取字符是一个好主意吗?

1 个答案:

答案 0 :(得分:0)

只需使用Read()代替ReadLine()。一个简单的异步实现看起来像这样:

void SomeMethod()
{
    Process process = ...; // init as appropriate, including redirection of stdout

    StringBuilder sb = new StringBuilder();

    var _ = ConsumeReader(process.StandardOutput, sb);
}

async Task ConsumeReader(TextReader reader, StringBuilder sb)
{
    char[] buffer = new char[1024];
    int cch;

    while ((cch = await reader.ReadAsync(buffer, 0, buffer.Length)) > 0)
    {
        sb.Append(buffer, 0, cch);
    }
}

以上只是将文本复制到StringBuilder。大概在你自己的场景中你会做其他的事情,比如解析它并回应提示,那样的事情。鉴于缺乏代码示例,我不能比这更具体。

此示例还忽略了异步方法返回的Task。在您的情况下这可能没问题,或者您可能希望为变量提供比_更好的名称,并最终在稍后的某个时间等待Task。根据需要使用它。