我正在我的C#应用程序中启动一个运行控制台应用程序的进程.我重定向了标准输入和输出,并且能够通过StandardOutput.ReadLine()读取几行.我确信我已正确配置ProcessStartInfo.
控制台应用程序启动时会输出几行(以"marker"行结尾),然后等待输入.收到输入后,它再次输出几行(再次以"标记"行结束),依此类推.我的目的是从它读取行直到我收到"标记"行,此时我知道发送适当的输入字符串.
我的问题是,经过几次迭代,程序挂起.暂停调试器往往会将挂起置于对StandardOutput.EndOfStream的调用中.以下测试代码就是这种情况:
while (!mProcess.StandardOutput.EndOfStream) // Program hangs here.
{
Console.WriteLine(mProcess.StandardOutput.ReadLine());
}
Run Code Online (Sandbox Code Playgroud)
当我测试"marker"行时,如果我在读取行后尝试访问StandardOutput.EndOfStream,我会得到同样的挂起:
string line = "";
while (!isMarker(line))
{
line = mProcess.StandardOutput.ReadLine();
}
bool eos = mProcess.StandardOutput.EndOfStream; // Program hangs here.
Run Code Online (Sandbox Code Playgroud)
我可能会做什么导致这个属性如此可怕地执行?
Han*_*ant 10
您无法在此处可靠地使用EndOfStream.如果没有任何缓冲的字符,StreamReader.EndOfStream属性将调用StandardOutput.Read().如果进程没有向其输出管道发送任何内容并且不关闭它,那么Read()调用将阻塞.由于它将等待输入,因此几乎可以保证发生这种情况.在进程关闭输出管道的末尾并且StreamReader消耗了所有缓冲的字符之前,EndOfStream不会返回true.程序终止时.
使用BeginOutputReadLine()可能是检测"标记"行的更好方法.请注意,回调发生在另一个线程上.另请注意,没有必要等待进程发送标记,您编写的任何内容都将被缓冲,直到进程准备好读取它为止.请注意缓冲区很小,可能会出现死锁.
| 归档时间: |
|
| 查看次数: |
6210 次 |
| 最近记录: |