0

このコードを使用して HttpWebResponse ストリームを読み取ります

Stream stm = httpResp.GetResponseStream();
Stream fs = new FileStream(filename, FileMode.Append, FileAccess.Write);
byte[] buff = new byte[1024 * 16];

AsyncCallback callback = null;
callback = ar =>
{
    int bytesRead = stm.EndRead(ar);
    fs.Write(buff, 0, bytesRead);
    if(bytesRead == 0)
        return;

    stm.BeginRead(buff, 0, buff.Length, callback, null);
};
stm.BeginRead(buff, 0, buff.Length, callback, null);

ダウンロード速度を制限したい。Thread.Sleep() を callback 内に配置すると、スレッドがブロックされたままになりますが、多くのストリームではうまくスケーリングされません。ダウンロード制限とスレッド節約を達成する他の方法はありますか?

4

1 に答える 1

0

ループ内にスリープを入れると、ダウンロード速度が制限される場合があります。これは、基になるプロトコルの実装と内部ネットワーク ストリーム バッファーのサイズによって異なります。

私のシステム (Windows Server 2008、.NET 4.5) では、ループにスリープを入れるとダウンロード速度が制限されます。

また、プロパティの設定によっても異なりrequest.AllowReadStreamBufferingます。ドキュメントには、デフォルト設定はtrueであると記載されていますが、私のテストではデフォルトがfalse私のシステムにあることが示されています。実際、それを設定しようとするとtrue、例外がスローされます。

ただし、デフォルトはtrueSilverlight 用のようです。そのプロパティについては、Silverlight のドキュメントを参照してください。に設定するtrueと、応答を読み取る準備ができる前に、応答全体が読み取られてバッファリングされます。

BeginRead読み取りリクエストのレートを制限するとダウンロード レートが制限されると仮定すると (読み取りストリームのバッファリングを無効にすれば、これは妥当と思われます)、 /を使用してそれを行う良い方法がわかりませんEndRead。あなたが指摘するようにThread.Sleep、そこに a を入れてもうまくスケーリングされません。

.NET 4.5 および C# 5.0 ではGetResponseAsync、応答を取得するために使用すること、およびReadAsync応答ストリームを読み取るときに使用することを検討する必要があります。.NET 4.0 では、読み取りを行うタスクを作成できます。どちらでもTask.Delayを使用して遅延を作成できます。これは、ダウンロード速度を制御する場合と同じ効果がThread.Sleepありますが、スレッドをブロックしません。

残念ながら、私はあなたのための例を持っていません.

于 2013-03-17T05:23:48.070 に答える