代码之家  ›  专栏  ›  技术社区  ›  Rubens Farias

我可以为threadpool.queueuserworkitem定义频率检查吗?

  •  0
  • Rubens Farias  · 技术社区  · 15 年前

    我实施了 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. 我能定义吗? 线程池。队列用户工作项 检查间隔?
    2. 如果没有,是否有其他方法来实现这一要求(带宽限制?)
    3. 如果没有,我能要一匹小马吗?

    蒂亚

    1 回复  |  直到 15 年前
        1
  •  1
  •   Henk Holterman    15 年前

    你不应该这样盯着一个穷人。一般来说,任何使用sleep()的线程解决方案都是可疑的。

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

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