0

我实施了一个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,我就失去了对代码执行频率的控制,所以它不需要一秒钟的时间来执行,这种差异反映在下载吞吐量上。

所以,我的问题是:

  1. 我可以定义ThreadPool.QueueUserWorkItem检查间隔吗?
  2. 如果没有,是否有另一种方法来实现此要求(带宽限制?)
  3. 如果没有,我可以养一匹小马吗?

TIA

4

1 回答 1

1

你不应该挂在这样的 PoolThread 上。通常,任何使用 Sleep() 的线程解决方案都是可疑的。

您可以使用System.Threading.Timer,我不确定准确度(大约 20 毫秒),但它不会“消失”。

Timer 将替换委托中的 while 循环。

于 2009-10-19T20:50:50.107 回答