2013-12-16 61 views
3

我有一个类读取一个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。 任何帮助表示赞赏。

+0

我不知道确切的步骤来做到这一点,但我会分解这个问题。你需要做的第一件事是找出每个实例的当前比特率,然后总结总数,然后检查总数与限制值。如果总数超过限制(800 kb/s),则延迟时间延长,延迟时间减少则减少延迟。 –

回答

2
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)); 
} 

请注意包含单位的表达性变量命名。

该算法的思想是计算下载已占用多长时间的当前点。如果它比它应该有更快的速度,那就睡一下吧。

这是数值稳定的,因为您不会逐步更新任何变量。