首页 > 解决方案 > 为什么 Process.StandardOutput.ReadToEnd 与常规 StreamReader.ReadToEnd 的行为不同?

问题描述

现在是凌晨 2 点,我很困惑为什么Process.StandardOutput.ReadToEnd()会这样。不知何故,它设法仅在完成后读取进程的所有输出,而不是仅读取标准输出的一部分(这是预期的,因为进程是异步运行的。)

ReadToEnd结合Process.WaitForExit(); 它不是单独使用的。ReadToEnd完全按照文档中的说明工作,但是当我尝试使用 a MemoryStream、 aStreamReader和 asynchronous来模拟它时StreamWriter,会StreamReader.ReadToEnd()立即返回,而输出与StreamWriter. 不是那Process.ReadToEnd行不通;我只是对为什么会这样感到困惑。

这是执行文件的代码:

public static void Main(string[] args){
   for(int i = 0;i<50;i++){
      Console.WriteLine($"some string {i}");
      Thread.Sleep(arbritraryDelay);
   }
}

这是测试代码:

void ProcessTest(){
    var process = new Process
    {
        StartInfo = new ProcessStartInfo()
        {
            FileName = "dotnet",
            Arguments = "executedFile.dll",
            UseShellExecute = false,
            RedirectStandardOutput = true
        }
    };

    process.Start();

    var result = process.StandardOutput.ReadToEnd();

    process.WaitForExit();
    //Result is the entire output
}
void SimulatedTest(){
    using(var stream = new MemoryStream()){
        var writer = new StreamWriter(stream);
        var reader = new StreamReader(stream);

         Task.Run(() => {
                for(int i = 0;i<50;i++){//Near identical code to the executed file
                    writer.Writeline($"some string {i});
                    Thread.Sleep(arbritraryDelay);
                }
            }
        );
        var result = reader.ReadToEnd(); //different output
    }
}

我希望ProcessTest行为与 相同SimulatedTest,但ProcessTest实际上捕获了所有输出。

标签: c#processstream

解决方案


推荐阅读