如何通过System.Diagnostics.Process重定向dotnet-counters的标准输出?
问题根因
dotnet-counters的monitor子命令默认运行在交互模式下,内部会检测控制台按键输入(比如检测用户是否按q退出),当你重定向了标准输入、且进程没有关联控制台时,调用控制台按键检测API就会抛出这个InvalidOperationException异常。
可行解决方案
方案1:添加--non-interactive参数(推荐,适用于.NET 5+版本的dotnet-counters)
这个参数是官方专门为非交互场景、输出重定向场景设计的,开启后工具会跳过控制台按键检测逻辑,直接向标准输出写入性能指标数据。
如果需要后续在Web应用中方便解析数据,还可以额外添加--format json参数,让工具输出结构化的JSON格式数据。
修正后的代码示例:
var startinfo = new ProcessStartInfo( "dotnet-counters" ) { // 新增--non-interactive参数,按需添加--format json Arguments = $"monitor --process-id 1 --non-interactive", CreateNoWindow = true, UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, // 非交互模式下不需要重定向标准输入,可以直接删除这行配置 // RedirectStandardInput = true, }; var process = new Process { StartInfo = startinfo }; process.OutputDataReceived += OnReceived; process.ErrorDataReceived += OnReceived; process.Exited += OnExist; process.Start(); process.BeginOutputReadLine(); process.BeginErrorReadLine();
方案2:使用collect子命令替代(适用于不需要实时输出的场景)
如果不需要实时推送数据到前端,可以用collect命令把性能指标导出到csv/json格式的本地文件,Web应用定时读取文件内容展示即可,不需要处理进程输出重定向的逻辑。
注意事项
- 确保运行进程的身份有足够权限访问目标PID对应的进程,否则会出现权限不足报错
- 如果需要限制输出的指标范围,可以在参数中添加
--counters参数指定要采集的计数器,减少不必要的输出 - 若使用的是.NET 5之前的旧版本dotnet-counters不支持
--non-interactive参数,优先升级工具版本即可解决
内容的提问来源于stack exchange,提问作者LoremIpsum
相关产品推荐
相关产品推荐

