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:
- Puis-je définir l'intervalle de vérification
ThreadPool.QueueUserWorkItem
? - Sinon, existe-t-il une autre approche pour satisfaire cette exigence (limitation de la bande passante?)
- Sinon, puis-je avoir un poney?
TIA