这有点痛苦,因为我现在没有代码在我面前,但我会尝试解释。
我有一个简单的C#应用程序,可以启动一个Ruby脚本(它会执行其他一些操作,因此它会生成一个批处理文件并执行它)。
我正在使用C#进程对象,我设置了以下内容 redirectstandardoutput = true redirectstandarderror = true UseShellExecute = false CreateNoWindow = true(那里有一些倒退的逻辑!)
然后我创建两个线程并为错误和输出流轮询ReadLine(),等待它们在我调用WaitForExit()之前完成。
现在,无论我做什么,当我重定向输出时,我的Ruby脚本都无法调用系统(“xcopy ...”)命令(没有生成错误,它只是不复制)。它也不会复制我要求复制的其他文件。
如果我将两个流定向到一个线程(其中一个,只重定向其中一个并且只调用ReadToEnd()),就会发生这种情况。
只有将redirectstandardoutput和redirectstandarderror设置为false才能正常工作。
我在这里完全失败了。我想也许输出流正在填满,但我无法想象为什么如果我正在调用ReadLine(我需要读取行,所以我可以解析每一行,只向最终用户提供相关的)。我也认为从线程C#进程调用dos命令可能会导致问题。
有没有人知道这里会发生什么?我应该说我在VS .net 2005上,我认为它是.Net Framework 2.0。
答案 0 :(得分:9)
有一个obscure post on the MSDN forums似乎表明XCOPY本身可能存在故障 - 如果你重定向XCOPY的STDOUT,你还必须重定向STDIN。
(注意:我将此标记为社区维基,所以知道ruby的人可以编写一些示例代码来重定向STDIN for system())