2009-10-19 54 views
0

我實施了System.Web.IHttpAsyncHandler以限制文件下載的網站帶寬使用情況。一旦定義了用戶帶寬,我需要每秒發送一次byte[](或準確的說是1000毫秒)。喜歡的東西:我可以爲ThreadPool.QueueUserWorkItem定義頻率檢查嗎?

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

回答

1

你不應該掛在那樣的PoolThread。一般來說,任何使用Sleep()的Threading解決方案都是可疑的。

您可以使用System.Threading.Timer,我不確定精度(大約20ms),但它不會「飄蕩」。

該定時器將替換您的委託內部的while循環。

相關問題