为什么流程的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'命令,这只是一个测试应用程序,尝试一些东西,直到这个问题被修复。
当进程的输出在内部进行缓冲时,它的行为可能会根据输出的目的地以微妙的方式发生变化。如果输出是console,则写入行结束符会自动刷新输出缓冲区。当输出是文件或其他流(例如,另一个程序试图读取其输出)时,打印输出可能会保持缓冲,直到发生以下三种情况之一:
- 程序写入足够的输出,使缓冲区自动刷新,或
- 程序显式刷新缓冲区,或者
- 程序退出
看来你是在观察第三种情况。