d70d81ebdf
OneDrive Backup
50 lines
1.5 KiB
C#
50 lines
1.5 KiB
C#
using System.Diagnostics;
|
|
|
|
namespace onedrive_backup.Graph
|
|
{
|
|
public class TransferSpeedHelper
|
|
{
|
|
private Stopwatch _stopWatch = new Stopwatch();
|
|
private double _prevProgress = 0;
|
|
private double _prevTimeStamp = 0;
|
|
private double _speedCap;
|
|
|
|
public TransferSpeedHelper(double? speedCapKBSec)
|
|
{
|
|
_speedCap = speedCapKBSec != null ? speedCapKBSec.Value * 1024 : double.MaxValue;
|
|
}
|
|
public void Start()
|
|
{
|
|
Reset();
|
|
_stopWatch.Start();
|
|
}
|
|
|
|
public void Reset()
|
|
{
|
|
_stopWatch.Reset();
|
|
_prevTimeStamp = 0;
|
|
_prevProgress = 0;
|
|
}
|
|
|
|
public (double delay, double ratePerSecond) MarkAndCalcThrottle(double progress)
|
|
{
|
|
double bytesTransfered = progress - _prevProgress;
|
|
var ellapsedMS = _stopWatch.ElapsedMilliseconds;
|
|
double timefromPrev = ellapsedMS - _prevTimeStamp;
|
|
double ratePerSecond = 1000 * bytesTransfered / timefromPrev;
|
|
|
|
_prevTimeStamp = ellapsedMS;
|
|
_prevProgress = progress;
|
|
|
|
if (ratePerSecond > _speedCap)
|
|
{
|
|
var targetTimeForSpeedMS = (bytesTransfered / _speedCap) * 1000;
|
|
var remainingTimeToWait = targetTimeForSpeedMS - _prevTimeStamp;
|
|
return (remainingTimeToWait, ratePerSecond);
|
|
}
|
|
|
|
return (0, ratePerSecond);
|
|
}
|
|
}
|
|
}
|