2009-10-19 3 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. Если нет, могу ли я иметь пони?

ТИА

ответ

1

Вы не должны повесить на PoolThread подобное. И вообще, любое решение Threading, использующее Sleep(), является подозрительным.

Вы можете использовать System.Threading.Timer, я не уверен в точности (примерно ~ 20 мс), но он не «блуждает».

Таймер заменит цикл while внутри вашего делегата.

 Смежные вопросы

  • Нет связанных вопросов^_^