为比特率限制计算Thread.Sleep()
问题描述:
我有一个类读取一个http流文件。为比特率限制计算Thread.Sleep()
static long CurrentMilliseconds { get { return Environment.TickCount; } }
public void ReadFile()
{
...
while(true)
{
int r = stm.Read(buf, 0, bufSize);
if(r == 0) break;
...
int x= CalculateDelay()
Thread.Sleep(x);
}
}
比方说,我并行下载5个文件(该类运行5个实例),我想总码率< 800 kb/s的
我很难计算,延迟x。 任何帮助表示赞赏。
答
double downloadDurationInSec = ...; //provide this
long bytesTransferred = ...; //provide this
double targetBytesPerSec = 800 * 1000;
double targetDurationInSec = bytesTransferred/targetBytesPerSec;
if (targetDurationInSec < downloadDurationInSec) {
double sleepTimeInSec = downloadDurationInSec - targetDurationInSec;
Thread.Sleep(TimeSpan.FromSeconds(sleepTimeInSec));
}
请注意包含单位的表达性变量命名。
该算法的思想是计算下载已占用多长时间的当前点。如果它比它应该有更快的速度,那就睡一下吧。
这是数值稳定的,因为您不会逐步更新任何变量。
我不知道确切的步骤来做到这一点,但我会分解这个问题。你需要做的第一件事是找出每个实例的当前比特率,然后总结总数,然后检查总数与限制值。如果总数超过限制(800 kb/s),则延迟时间延长,延迟时间减少则减少延迟。 –