带宽使用监视器返回过多的数字

时间:2013-07-28 17:28:35

标签: c# network-programming performancecounter

我有以下代码可以衡量当前的下载和上传速度。我面临的问题是,通常会记录我的网络和/或互联网连接甚至无法处理(高于我的带宽)。

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;
    }

示例输出:

Screenshot

正如您所看到的,大多数这些条目都表明网络使用频繁,最高可达160MB / s。我意识到你只能用一条记录测量传输速度(这是测试数据,在实际应用中我使用最新3的平均值),但即便如此:我怎么能在一秒钟内收到160MB。我相信可以说我必须在某个地方犯了错误,但我找不到。

我有一个想法是我应该在循环中保留一个计数器以显示PerformanceCounter.NextValue()被访问了多少次(通常在46到48之间),但最后我认为这无关紧要:在宏大图片中,我只有一秒钟的带宽使用数量太大了。我不能动摇性能计数器可能是原因的感觉。

旁注:我加载一个新的YouTube视频时录制了160MB / s的数字,而当我刷新一个标签时,其他(+1000 KB / s)录音通常都会被录制,因此它应该是我的(相对)显示网络使用情况。

我的做法是否忽略了某些内容?

编辑:

在遵循@ Sam的建议并根据内置perfmon.exe检查我的结果时,我注意到我在带宽使用中的爆发通常与Perfmon中显示的同时发生,但是我的更大。我试图链接同步突发并找到共同点,但它似乎相当随机(可能是因为Perfmon可能会结合几个结果来获得当前速度,而我只使用最新的第二个)。

同样适用于较低的数字:Perfmon通常显示&lt; 10kbps,而我一直在50kbps左右。

enter image description here

EDIT2:

这是我在参考@Hans'评论

时使用的代码
var initSent = dataSentCounter.NextValue();
var initReceived = dataReceivedCounter.NextValue();
Thread.Sleep(1000);

sentSum = dataSentCounter.NextValue() - initSent;
receiveSum = dataReceivedCounter.NextValue() - initReceived;

0 个答案:

没有答案
相关问题