C# 为什么Process.StandardOutput.ReadToEnd与常规StreamReader.ReadToEnd具有不同的行为?
现在是凌晨2点,我不明白为什么C# 为什么Process.StandardOutput.ReadToEnd与常规StreamReader.ReadToEnd具有不同的行为?,c#,process,stream,C#,Process,Stream,现在是凌晨2点,我不明白为什么Process.StandardOutput.ReadToEnd()会这样做。不知何故,它只能在流程完成后读取流程的所有输出,而不是仅读取标准输出的一部分(这是预期的,因为流程是异步运行的) ReadToEnd与Process.WaitForExit()结合使用;它不是单独使用的ReadToEnd的工作原理与文档中的完全相同,但是当我尝试使用MemoryStream、StreamReader和异步StreamWriter进行模拟时,StreamReadToEnd()
Process.StandardOutput.ReadToEnd()
会这样做。不知何故,它只能在流程完成后读取流程的所有输出,而不是仅读取标准输出的一部分(这是预期的,因为流程是异步运行的)
ReadToEnd
与Process.WaitForExit()结合使用
;它不是单独使用的ReadToEnd
的工作原理与文档中的完全相同,但是当我尝试使用MemoryStream
、StreamReader
和异步StreamWriter
进行模拟时,StreamReadToEnd()
立即返回,没有与StreamWriter
编写的相同的输出。这并不是说过程。ReadToEnd
不起作用;我只是不明白为什么会这样
以下是已执行文件的代码:
publicstaticvoidmain(字符串[]args){
对于(int i=0;ii如果您选中,则类型为StreamReader
,因此您的问题看起来是由您自己的测试引起的。可能是因为有两个流和一些竞争条件。当您打开并读取文件时,Windows将在您到达文件末尾时关闭流。c#实际上是调用Windows方法来进行读取。W对于标准输入/输出,应用程序必须关闭通常在应用程序结束时出现的流。因此,标准输入流仍然是打开的。@bradbury9我知道进程。标准输出
是一个流阅读器
。我只是好奇进程。标准输出
是如何编写的,以便它能在是的,因为从StreamReader
的工作方式来看,它似乎不直观。@jdweng我不相信这能回答任何问题,除非我误解了你的意思。你的问题是“ReadToEnd有效”。它在读取文件时工作,因为windows关闭了流/文件,因此有一个文件结尾。当应用程序使用标准输出运行时,流仍然打开,因此没有流结尾。应用程序仍然可以向流结尾添加更多数据。windows流只有一个指针,可以创建问题。Linux是much更好,有两个流指针。一个指示输入位置,on指示输出位置。Linux在输出仍在读取时,可以将输入位置设置为null。Windows无法这样做。