簡體   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