You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 13:36:03