繁体   English   中英

我可以为ThreadPool.QueueUserWorkItem定义频率检查吗?

[英]Can I define frequency check for ThreadPool.QueueUserWorkItem?

我实现了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

您不应该像那样死守一个PoolThread。 通常,任何使用Sleep()的线程解决方案都是可疑的。

您可以使用System.Threading.Timer ,我不确定准确性(大约〜20ms),但是它不会“漂移”。

计时器将替换委托中的while循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM