2

我有以下代码可以测量当前的下载和上传速度。我面临的问题是,经常记录的使用情况是我的网络和/或互联网连接甚至无法处理(超出我的带宽)。

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 之间),但最后我认为这无关紧要:在宏伟的画面中,我是对于仅仅一秒钟的带宽使用来说,仍然有一个太大的数字。我无法摆脱性能计数器可能是原因的感觉。

旁注:160MB/s 的数字是在我加载新的 youtube 视频时记录的,而其他 (+1000 KB/s) 记录通常是在我刷新标签时完成的,因此它应该是我网络使用情况的(相对)显示。

我是否在我的方法中忽略了一些东西?

编辑:

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

较低的数字也是如此:Perfmon 通常显示 < 10kbps,而我一直在 50kbps 左右。

在此处输入图像描述

编辑2:

这是我在参考@Hans 评论时使用的代码

var initSent = dataSentCounter.NextValue();
var initReceived = dataReceivedCounter.NextValue();
Thread.Sleep(1000);

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

0 回答 0