当前位置: 首页 > 编程语言 > C#

读取其他进程的控制台输出分享

时间:2023-04-11 00:45:10 C#

读取其他进程的控制台输出我在“wave”中返回控制台输出时遇到问题。例如,控制台每秒输出一些东西,例如事件每分钟触发60次(所有事件同时发生)。我的代码:ProcessProc=newProcess();Proc.StartInfo.FileName=SSMS.BinaryDir+"HldsUpdateTool.exe";Proc.StartInfo.Arguments="-commandupdate-gametf-dir"+SSMS.RootDir+Key;Proc.StartInfo.UseShellExecute=false;Proc.StartInfo.RedirectStandardOutput=true;Proc.StartInfo.RedirectStandardError=true;Proc.EnableRaisingEvents=true;Proc.StartInfo.CreateNoWindow=false;Proc.OutputDataReceived+=newDataReceivedEventHandler(Proc_OutputDataReceived);Proc.Exited+=newEventHandler(Proc_Exited);Proc.Start();Proc.BeginErrorReadLine();Proc.BeginOutputReadLine();我可能怀疑更新工具有问题。其他带有控制台输出的程序运行良好。事件被触发的时间线:(=什么都没发生;|事件被触发)应该是:==|==|==|==|==|==|==是:========|||||||=========||||||=====您看到了程序使用的标准输出缓冲区的效果。这是C运行时库的标准功能,当它检测到缓冲区正在被写入管道而不是控制台时,将启用缓冲。而不是在程序中的每个printf()语句之后自动刷新。缓冲区通常约为2KB。它只有在满的时候才会被冲走。这大大提高了效率,为每次刷新增加了很多开销。在正常重定向场景中将输出写入文件或设备时很重要。您可以看到它的去向,您看到的块就是该缓冲区的内容。没有简单的修复方法,程序中需要进行手术以禁用缓冲区或在重要的地方刷新缓冲区。这总是责任停止的地方,如果你可以改变程序,你就不会。您可以通过缓冲从OutputDataReceived获得的内容来滴灌您的控制台,但这可能有点愚蠢。当程序发送输出的速度快于其处理速度时,您将看不到这种效果。这很常见。它在等待输出缓冲区清空并快速填充时被有效地节流、阻塞。另一种解释是,OutputReceived的触发速率还取决于您正在运行的线程池线程数。如果这超过cpu核数,调用OutputReceived的tp线程可能会延迟0.5秒的倍数。但是,您会看到重定向的所有程序的集合。我不熟悉C#,但您可以通过搜索控制台刷新文档找到有关此问题的有用信息。也许是这样的:Console.Out.Flush()如果您要打印到错误流,请考虑使用Console.Out.Flush()(和Console.Error.Flush())。据我了解,处理程序没有使用Console.Out.Write()写入命令行-他们正在写入其他句柄打印出来的缓冲区。通过多次调用Console.Out.Write(),所有缓冲区不会同时写入-一些文本在缓冲区中的停留时间比其他文本长。Console.Out.Flush()强制系统立即写入其当前缓冲区。以上就是C#学习教程:阅读其他进程控制台输出共享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: