我正在扩展一个.NET4命令行应用程序,除其他外,它创建一个外部进程来调用svn.exe
从我们的存储库中提取一些数据。问题是当我们的帐户密码更改时,身份验证失败,SVN会提示输入帐户密码。
SVN通过向标准错误写提示来完成此操作。输出如下:
STDOUT: Updating '.': STDERR: Authentication realm: <http://{host}:8080> VisualSVN Server STDERR: Password for 'joe.smith':
我认为它出错的地方是来自子进程的第二个“行”(以后的CP)不包含换行符,并且可能没有被 BeginErrorRead 行拾取(在父进程(PP)阻塞标准输入流之前。关闭CP上的输入流会导致输出和错误流中的剩余数据由我的 DataReceivedEventHandler 回调处理。
支持我的猜测。事件序列似乎是:
假设我已正确诊断出问题,我仍然不知道如何应对。
至于我尝试的选项:
为了澄清,如何在不造成死锁的情况下安全地读取到标准错误流的末尾?
答案 0 :(得分:1)
我认为您的分析是正确的。我不得不做一些CP stdio重定向,在Win32上总是很痛苦(设计为UI平台而不是命令行......)。
无论如何,您可以尝试从实际流中读取(使用BeginRead
或ReadAsync
,如果是.NET 4.5)并自行进行Encoding
转换。那将是我的第一次尝试。
否则,您必须使用多个线程。我以前做过这件事,这很痛苦。
无论哪种方式,你实际上并没有等待CP的stderr结束。只需监控它为你的魔法字符串。大多数控制台程序在退出之前不会关闭它们的stdout或stderr,因此在它退出之前你无法一直读到它。