.NET6 C#异步调用IPerf3无法实时逐行输出问题排查
解决.NET6中执行iPerf3命令无法实时接收输出的问题
在.NET6的C#应用中异步执行iPerf3命令时,期望实时逐行显示命令输出,但当前程序要等到命令执行完成后才会一次性输出全部内容。命令行直接执行时每秒输出一行,但代码运行后,虽然最终统计到输出是20行,OutputDataReceived事件却要等命令结束约10秒后才触发。
解决方案
问题根源是部分版本的iPerf3不会在输出换行时主动刷新缓冲区,只需在iPerf3的命令参数中添加--forceflush选项强制刷新输出缓冲区即可实现实时接收。
修改后的代码
using System.Diagnostics; bool complete = false; int count = 0; var proc = new Process { EnableRaisingEvents = true, StartInfo = new ProcessStartInfo { FileName = "iperf3.exe", // 添加--forceflush参数强制刷新输出缓冲区 Arguments = $"-c 1.2.3.4 --forceflush", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, CreateNoWindow = true, } }; proc.OutputDataReceived += (s, e) => { Console.WriteLine(e.Data); count++; }; proc.ErrorDataReceived += (s, e) => Console.WriteLine(e.Data); proc.Exited += (sender, args) => { complete = true; }; proc.Start(); proc.BeginOutputReadLine(); proc.BeginErrorReadLine(); proc.WaitForExit(); proc.Dispose(); Console.WriteLine($"LineCount:{count}");
效果说明
修改后,OutputDataReceived事件会在iPerf3每输出一行内容时立即触发,实现和命令行直接执行一致的实时逐行输出效果。
内容的提问来源于stack exchange,提问作者user5265160
相关产品推荐
相关产品推荐

