HttpWebRequest.GetResponse().GetResponseStream()
からのストリームを使用して、ストリーミングWeb APIからデータを読み取っています。私は、ストリームに65Kバイトのバッファを持つBegin
/EndRead
を使用します。HttpWebResponse不均一なチャンクでストリームを読み取る
16383 bytes read.
1 bytes read.
16383 bytes read.
1 bytes read.
16383 bytes read.
1 bytes read.
etc...
は明らかに1つのバイトは、プロセスの非効率をたくさん紹介読み込み、私が提供するバッファサイズは16384バイト以上にフィットするのに十分な大きさである:私は、データが次のパターンで返されていることがわかります。これを改善するためのクライアントとして何かできることはありますか、それとも単にデータをサーバーに送信するのですか?
リーダーコードは基本的に:
var buffer = new byte[65536];
using (var stream = response.GetResponseStream()) {
while (true) {
var bytesRead = await AsyncRead(stream.BeginRead, stream.EndRead, buffer);
Console.WriteLine($"{bytesRead} bytes read.");
// do something with the bytes
}
}
AsyncReadメソッドは、コールバックだけでEndRead
次いで、BeginRead(buffer, 0, buffer.Length, callback, null)
を呼び出し、EndRead
の戻り値を返す場合。
これは.NET 4.0で、HttpClientはありません。
http接続が開いたままで、データ転送がおそらくそのバイトを読み取るためのCPUオーバーヘッドよりもずっと遅いので、1バイトが効率を大幅に低下させるかどうかはわかりません。それにもかかわらず、それは奇妙な行動です。あなたは読者コードの関連部分を投稿できますか? – Stefan
@Stefan、確かに、それは実際には別の非同期実装を使用するFですが、私は翻訳しました。非同期コードには何も特別なことはありませんが、パラメータと戻り値をそのまま渡すだけです。 – Asik
野生の推測:圧縮または暗号化が原因です。 'HttpWebRequest'で圧縮をオフ(またはオン)にしてみてください。同様に、動作が 'http'対' https'接続で同じかどうかを見てください。私はTLSが2^14バイトサイズのチャンク(すなわち16384バイト)でデータを送信すると信じています。 –