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