【发布时间】:2019-09-17 11:02:05
【问题描述】:
我正在创建一个 C# WinForm 应用程序,它将显示给定进程的网络活动(接收的字节数/发送的字节数)(例如:进程名称的chrome.exe)和进程生成的速度(以兆字节/秒为单位)。
我的应用程序使用Performance Counter 类来获取进程活动,例如IO Read Bytes/sec 用于接收字节,IO Writes Bytes/sec 用于发送字节。但是,它给了我 0 Bytes 结果,这很奇怪,因为chrome.exe 正在运行并且它肯定使用了一些字节数据。
我试图找到解决方案的研究是:
- https://stackoverflow.com/a/17026417/5377037
- C# Resource Monitor get network activity values
- https://www.c-sharpcorner.com/forums/i-want-to-develop-resource-monitor-desktop-application
这是我正在使用的一些代码:
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