我实施了一个System.Web.IHttpAsyncHandler
来限制文件下载的网站带宽使用。一旦定义了用户带宽,我需要byte[]
每秒发送一次(或者准确地说是 1000 毫秒)。就像是:
public class DownloadHandler : IHttpAsyncHandler
{
public IAsyncResult BeginProcessRequest(
HttpContext context, AsyncCallback cb, object extraData)
{
// user can download that file?
DownloadAsync download = new DownloadAsync(...);
download.StartDownload()
return download;
}
}
class DownloadAsync : IAsyncResult
{
// ...
public void StartDownload()
{
ThreadPool.QueueUserWorkItem(new WaitCallback(startAsyncTask));
}
private void startAsyncTask(object state)
{
// ...
while (context.Response.IsClientConnected &&
offset < data.Arquivo.Tamanho)
{
// ... do stuff
context.Response.OutputStream.Write(buffer, 0, readCount);
// ... more stuff
Thread.Sleep(1000 - (int)elapsed.TotalMilliseconds);
}
}
}
一旦进入ThreadPool.QueueUserWorkItem
,我就失去了对代码执行频率的控制,所以它不需要一秒钟的时间来执行,这种差异反映在下载吞吐量上。
所以,我的问题是:
- 我可以定义
ThreadPool.QueueUserWorkItem
检查间隔吗? - 如果没有,是否有另一种方法来实现此要求(带宽限制?)
- 如果没有,我可以养一匹小马吗?
TIA