2009-10-19 5 views
0

J'ai mis en œuvre un System.Web.IHttpAsyncHandler pour limiter l'utilisation de la bande passante du site Web pour le téléchargement de fichiers. Une fois la bande passante utilisateur définie, je dois envoyer un byte[] toutes les secondes (ou 1000 millisecondes, pour être précis). Quelque chose comme:Puis-je définir une vérification de fréquence pour 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); 
     } 
    } 
} 

Une fois dans ThreadPool.QueueUserWorkItem, je perds le contrôle de fréquence mon code est en cours d'exécution, il ne prend pas une seconde à exécuter, et cette différence reflète le débit de téléchargement.

Alors, mes questions sont les suivantes:

  1. Puis-je définir l'intervalle de vérification ThreadPool.QueueUserWorkItem?
  2. Sinon, existe-t-il une autre approche pour satisfaire cette exigence (limitation de la bande passante?)
  3. Sinon, puis-je avoir un poney?

TIA

Répondre

1

Vous ne devriez pas accrocher à un PoolThread comme ça. Et en général, toute solution Threading qui utilise Sleep() est suspecte.

Vous pouvez utiliser System.Threading.Timer, je ne suis pas sûr de la précision (environ ~ 20ms), mais il ne va pas «errer».

Le temporisateur remplacera la boucle while dans votre délégué.

Questions connexes