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

时间:2016-10-04 13:24:24

标签: c#

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。

注意:我不是为了使用“网络使用”而构建的。命令,这只是一个测试应用程序,可以在修复此问题之前尝试一些操作。

1 个答案:

答案 0 :(得分:0)

当进程的输出在内部缓冲时,其行为可能会以微妙的方式改变,具体取决于输出的目标。如果输出是控制台,则写入行尾字符会自动刷新输出缓冲区。当输出是文件或其他一些流(例如,另一个试图读取其输出的程序)时,打印输出可能会保持缓冲,直到发生以下三种情况之一:

  1. 程序写入足够的输出以使缓冲区自动刷新,或
  2. 程序显式刷新缓冲区,或
  3. 程序退出。
  4. 您似乎正在观察第三个案例。