【问题标题】:Getting 0 bytes in results for the given Process using performance counter in c#使用 c# 中的性能计数器在给定进程的结果中获取 0 字节
【发布时间】:2019-09-17 11:02:05
【问题描述】:

我正在创建一个 C# WinForm 应用程序,它将显示给定进程的网络活动(接收的字节数/发送的字节数)(例如:进程名称的chrome.exe)和进程生成的速度(以兆字节/秒为单位)。

我的应用程序使用Performance Counter 类来获取进程活动,例如IO Read Bytes/sec 用于接收字节,IO Writes Bytes/sec 用于发送字节。但是,它给了我 0 Bytes 结果,这很奇怪,因为chrome.exe 正在运行并且它肯定使用了一些字节数据。

我试图找到解决方案的研究是:

这是我正在使用的一些代码:

PerformanceCounter PC = new PerformanceCounter();
PC.CategoryName = "Process";
PC.CounterName = "IO Read Bytes/sec";
PC.InstanceName = "chrome";
PC.ReadOnly = true;

Console.WriteLine("Bytes Receieved: " + Math.Round(PC.NextValue()));
PC.CounterName = "IO Write Bytes/sec";
Console.WriteLine("Bytes Sent: " + Math.Round(PC.NextValue()));

结果:

Bytes Received: 0
Bytes Sent: 0

【问题讨论】:

  • 该计数器是采样的,不是累积的。在您阅读它的那一刻,没有字节被传输。检查RawValue 和/或定期读取计数器(该值开始变得有用需要一秒钟)。
  • 我使用了RawValue,它给了这个 576729973 这是不可能的价值。
  • 否 - 这意味着 Chrome 自启动以来已读取 576729973 个字节。当你再次阅读它时,你会看到它上升。只有当您定期阅读NextValue() 时,整个“每秒”的事情才会发挥作用。
  • 一个 foo/sec 计数器值需要等待一秒钟才能获得下一个值。然后它会告诉你在最后一秒发生了什么。当你第一次阅读它时什么都没有发生,所以你得到 0。使用计时器对其进行采样。

标签: c# .net performancecounter


【解决方案1】:

根据documentation

如果一个计数器的计算值依赖于两次计数器读取,第一次读取操作返回 0.0。重置性能计数器属性以指定不同的计数器相当于创建一个新的性能计数器,并且使用新属性的第一次读取操作返回 0.0。调用 NextValue 方法之间的建议延迟时间为一秒,以允许计数器执行下一次增量读取。

【讨论】:

  • 我得到了你的答案。您能告诉我如何获得此过程生成的以 MB 为单位的速度吗?
  • @5377037:你是指当前使用的速度,单位是MBit/s,还是这个进程发送/接收的总量?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多