C# 读取其他进程控制台输出

C# 读取其他进程控制台输出,c#,process,console,C#,Process,Console,当控制台输出以“waves”形式返回时,我遇到了问题。例如,控制台每秒输出一次,例如事件每分钟触发60次(所有事件同时发生) 我的代码: Process Proc = new Process(); Proc.StartInfo.FileName = SSMS.BinaryDir + "HldsUpdateTool.exe"; Proc.StartInfo.Arguments = "-command update -game tf -dir " + SSMS.RootDir + Key; Proc

当控制台输出以“waves”形式返回时,我遇到了问题。例如,控制台每秒输出一次,例如事件每分钟触发60次(所有事件同时发生)

我的代码:

Process Proc = new Process();
Proc.StartInfo.FileName = SSMS.BinaryDir + "HldsUpdateTool.exe";
Proc.StartInfo.Arguments = "-command update -game tf -dir " + SSMS.RootDir + Key;
Proc.StartInfo.UseShellExecute = false;
Proc.StartInfo.RedirectStandardOutput = true;
Proc.StartInfo.RedirectStandardError = true;

Proc.EnableRaisingEvents = true;
Proc.StartInfo.CreateNoWindow = false;

Proc.ErrorDataReceived += new DataReceivedEventHandler(Proc_ErrorDataReceived);
Proc.OutputDataReceived += new DataReceivedEventHandler(Proc_OutputDataReceived);
Proc.Exited += new EventHandler(Proc_Exited);

Proc.Start();
Proc.BeginErrorReadLine();
Proc.BeginOutputReadLine();
我可能怀疑更新工具有问题。其他带有控制台输出的程序工作正常

在触发事件的时间线中:(=未发生任何事件;|触发事件)


我一点也不熟悉C#,但是您可以通过在文档中搜索控制台刷新来找到关于这个问题的有用信息

也许是这样:

Console.Out.Flush() 

考虑使用
Console.Out.Flush()
(和
Console.Error.Flush()
,如果您也要打印到错误流)


据我所知,处理程序不是使用
Console.Out.Write()
向命令行写入数据,而是向缓冲区写入其他处理程序将打印出来的数据。通过多次调用
Console.Out.Write()
,所有缓冲区不会同时写入-一些文本留在缓冲区中的时间比其他文本长
Console.Out.Flush()
强制系统立即写入其当前缓冲区。

您可以看到程序正在使用的标准输出缓冲区的效果。这是C运行时库的一个标准特性,当它检测到它正在写入管道而不是控制台时,就会启用缓冲。而不是在程序中的每个printf()语句之后自动刷新。缓冲区通常约为2k字节。只有当它充满的时候才会被冲洗。这大大提高了效率,每次刷新都会增加大量开销。在正常重定向场景中,当输出写入文件或设备时,这一点很重要

你可以看到这是去哪里,你看到的丛是缓冲区的内容。没有简单的修复方法,程序中需要进行手术来禁用缓冲区或在重要的地方刷新缓冲区。这总是责任停止的地方,如果你能改变程序,你就不会这么做。您可以通过缓冲从OutputDataReceived获得的数据来为您的控制台提供点播,但这可能有点愚蠢

当程序发送输出的速度超过处理速度时,您将看不到这种效果。这很常见。它有效地受到限制,在等待输出缓冲区清空并快速将其填满时阻塞


对此还有一个解释,OutputReceived的触发速率也取决于您运行的线程池线程数。如果这超过了cpu内核的数量,那么调用OutputReceived的tp线程可能会延迟0.5秒的倍数。但是,您将在重定向的所有程序上看到聚集。

我认为您必须刷新输出。不知道怎么可能也想看看这个:
Console.Out.Flush()