0

System.Web.IHttpAsyncHandlerファイルのダウンロードに使用する Web サイトの帯域幅を制限するために を実装しました。ユーザー帯域幅を定義したら、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 秒もかからず、その差がダウンロードのスループットに反映されます。

だから、私の質問は次のとおりです。

  1. ThreadPool.QueueUserWorkItemチェック間隔を定義できますか?
  2. そうでない場合、この要件を達成するための別のアプローチはありますか (帯域幅調整?)
  3. そうでない場合、ポニーを飼ってもいいですか?

ティア

4

1 に答える 1

1

そのような PoolThread にしがみつくべきではありません。そして一般的に、Sleep() を使用するスレッド化ソリューションは疑わしいものです。

を使用できますSystem.Threading.Timer。精度についてはわかりませんが (約 20 ミリ秒)、「さまよう」ことはありません。

Timer は、デリゲート内の while ループを置き換えます。

于 2009-10-19T20:50:50.107 に答える