private void refresh() { if (downCounter == null || upCounter == null) { downSpeed = 0; upSpeed = 0; return; } if (downCounter.NextSample() == null || upCounter.NextSample() == null) { downSpeed = 0; upSpeed = 0; return; } downValue = downCounter.NextSample().RawValue; upValue = upCounter.NextSample().RawValue; downSpeed = (downValue - downValueOld) / (UpdateInterval / 1000d); upSpeed = (upValue - upValueOld) / (UpdateInterval / 1000d); downValueOld = downValue; upValueOld = upValue; //Avg. AdownSpeed[ArrayPtr] = downSpeed; AupSpeed[ArrayPtr] = upSpeed; ArrayPtr = (ArrayPtr + 1) % 5; //history upspeedActrual.RemoveAt(upspeedActrual.Count - 1); upspeedActrual.Insert(0, upSpeed); upspeedRelative = upspeedActrual.ToList(); GetRelative(ref upspeedRelative); downspeedActrual.RemoveAt(downspeedActrual.Count - 1); downspeedActrual.Insert(0, downSpeed); downspeedRelative = downspeedActrual.ToList(); GetRelative(ref downspeedRelative); void GetRelative(ref List <double> Relative) { double max = Relative.Max(); if (max > 0) { for (int i = 0; i < Relative.Count; i++) { Relative[i] = Relative[i] / max * 100; } } } }