为什么流程的StandardOutput只在流程终止后接收数据?

本文关键字:数据 终止 程终止 StandardOutput 为什么 | 更新日期: 2023-09-27 18:11:31

using (var process = new Process()
{
    StartInfo = {
        FileName = "net.exe",
        Arguments = @"use ''127.0.0.1'abc /user:test",
        UseShellExecute = false,
        RedirectStandardError = true,
        RedirectStandardInput = true,
        RedirectStandardOutput = true
    }
})
{
    process.OutputDataReceived += (sender, eventArgs) => Console.WriteLine(eventArgs.Data);
    process.ErrorDataReceived += (sender, eventArgs) => Console.WriteLine(eventArgs.Data);
    process.Start();
    process.BeginOutputReadLine();
    process.BeginErrorReadLine();
    string line;
    while ((line = Console.ReadLine()) != "stop") process.StandardInput.WriteLine(line);
    process.Close();
}

当你在cmd中运行这个命令时,它会要求你输入密码,但是,当我执行相同的命令时,我不会收到任何输出,直到进程终止。它甚至都不用等我输入密码。
代码有问题吗?我误会什么了吗?
它还会在systeminfo.exe等其他进程中出现错误。

注意:我不是构建这个只是为了使用'net use'命令,这只是一个测试应用程序,尝试一些东西,直到这个问题被修复。

为什么流程的StandardOutput只在流程终止后接收数据?

当进程的输出在内部进行缓冲时,它的行为可能会根据输出的目的地以微妙的方式发生变化。如果输出是console,则写入行结束符会自动刷新输出缓冲区。当输出是文件或其他流(例如,另一个程序试图读取其输出)时,打印输出可能会保持缓冲,直到发生以下三种情况之一:

  1. 程序写入足够的输出,使缓冲区自动刷新,或
  2. 程序显式刷新缓冲区,或者
  3. 程序退出

看来你是在观察第三种情况。