我有以下代码可以衡量当前的下载和上传速度。我面临的问题是,通常会记录我的网络和/或互联网连接甚至无法处理(高于我的带宽)。
public static IStatistics GetNetworkStatistics(string interfaceName) {
var networkStats = _interfaces[interfaceName];
var dataSentCounter = new PerformanceCounter("Network Interface", "Bytes Sent/sec", interfaceName);
var dataReceivedCounter = new PerformanceCounter("Network Interface", "Bytes Received/sec", interfaceName);
float sentSum = 0;
float receiveSum = 0;
var sw = new Stopwatch();
sw.Start();
while (sw.ElapsedMilliseconds < 1000) {
sentSum += dataSentCounter.NextValue();
receiveSum += dataReceivedCounter.NextValue();
}
sw.Stop();
Console.WriteLine("Download:\t{0} KBytes/s", receiveSum / 1024);
Console.WriteLine("Upload:\t\t{0} KBytes/s\n", sentSum / 1024);
networkStats.AddSentData(sentSum);
networkStats.AddReceivedData(receiveSum);
return networkStats;
}
示例输出:
正如您所看到的,大多数这些条目都表明网络使用频繁,最高可达160MB / s。我意识到你只能用一条记录测量传输速度(这是测试数据,在实际应用中我使用最新3的平均值),但即便如此:我怎么能在一秒钟内收到160MB。我相信可以说我必须在某个地方犯了错误,但我找不到。
我有一个想法是我应该在循环中保留一个计数器以显示PerformanceCounter.NextValue()
被访问了多少次(通常在46到48之间),但最后我认为这无关紧要:在宏大图片中,我只有一秒钟的带宽使用数量太大了。我不能动摇性能计数器可能是原因的感觉。
旁注:我加载一个新的YouTube视频时录制了160MB / s的数字,而当我刷新一个标签时,其他(+1000 KB / s)录音通常都会被录制,因此它应该是我的(相对)显示网络使用情况。
我的做法是否忽略了某些内容?
编辑:
在遵循@ Sam的建议并根据内置perfmon.exe
检查我的结果时,我注意到我在带宽使用中的爆发通常与Perfmon中显示的同时发生,但是我的更大。我试图链接同步突发并找到共同点,但它似乎相当随机(可能是因为Perfmon可能会结合几个结果来获得当前速度,而我只使用最新的第二个)。
同样适用于较低的数字:Perfmon通常显示&lt; 10kbps,而我一直在50kbps左右。
EDIT2:
这是我在参考@Hans'评论
时使用的代码var initSent = dataSentCounter.NextValue();
var initReceived = dataReceivedCounter.NextValue();
Thread.Sleep(1000);
sentSum = dataSentCounter.NextValue() - initSent;
receiveSum = dataReceivedCounter.NextValue() - initReceived;