我正在对Open Hardware Monitor进行一些更改。我将添加网络适配器下载和上传速度。但是当我计算下载速度时,我得到了错误的计算。
由于OHM中的自动更新,我无法使用计时器来计算正确的下载速度。 在源代码中,您可以看到我如何计算下载速度(以Mb / s为单位)。
在班级的构造中我做:
IPv4InterfaceStatistics interfaceStats = netInterfaces.GetIPv4Statistics();
bytesSent = interfaceStats.BytesSent;
bytesReceived = interfaceStats.BytesReceived;
stopWatch = new Stopwatch();
stopWatch.Start();
当调用更新方法时(在某些随机时间),我这样做:
IPv4InterfaceStatistics interfaceStats = netInterfaces.GetIPv4Statistics();
stopWatch.Stop();
long time = stopWatch.ElapsedMilliseconds;
if (time != 0)
{
long bytes = interfaceStats.BytesSent;
long bytesCalc = ((bytes - bytesSent)*8);
usedDownloadSpeed.Value = ((bytesCalc / time) * 1000)/1024;
bytesSent = bytes;
}
希望有人能看到我的问题?
添加了截图
答案 0 :(得分:1)
我之前的代码存在一些转换问题。 现在我有这个来源,它的工作原理。 Tnx全部用于回答。
interfaceStats = netInterfaces.GetIPv4Statistics();
//Calculate download speed
downloadSpeed.Value = Convert.ToInt32(interfaceStats.BytesReceived - bytesPreviousReceived) / 1024F;
bytesPreviousReceived = interfaceStats.BytesReceived;
答案 1 :(得分:0)
以下更改应有助于......
speed = netInterfaces.Speed / 1048576L;
如果我没记错的话,Speed
属性为long
,当您将其除以int
时,最终会得到截断结果。这使我们在您的其他计算中发生了类似的更改......
usedDownloadSpeed.Value = ((bytesCalc / time) * 1000L)/1024L;
...假设usedDownloadSpeed.Value
也是long
,以确保您没有通过隐式转化结果或计算获得任何截断值。如果您想要确保正确进行投射,请使用Convert.ToInt64()
。