0

MonoTouch アプリでいくつかの小さな画像 (それぞれ約 40 KB) をダウンロードしています。イメージは並行してダウンロードされます。メイン スレッドがリクエストを作成し、非同期で実行します。

を使用WebRequest.Createして HTTP 要求を作成し、完了ハンドラーで を使用して応答ストリームを取得しますresponse.GetResponseStream()。次に、次のコードは応答ストリームからデータを読み取ります。

var ms = new MemoryStream();
byte[] buffer = new byte[4096];
int read;
while ((read = responseStream.Read(buffer, 0, buffer.Length)) > 0)
{
    ms.Write(buffer, 0, read);
}

1 つのイメージのみをダウンロードする場合、これは非常に高速に実行されます (Web 要求の待機を含めて 50 ~ 100 ミリ秒)。ただし、5 ~ 10 などの複数の画像があるとすぐに、これらの行が完了するまでに 2 秒以上かかります。スレッドが 4 秒以上かかることもあります。response.BeginGetResponseコールバックの実行に必要な時間や待機時間について話しているのではないことに注意してください。

次に、次のコードをテストしました。同じシナリオで必要な時間は 100 ミリ秒未満です。

var ms = new MemoryStream();
responseStream.CopyTo(ms);

最初のバージョンでこの大きな遅延が発生した理由は何ですか?

コードの最初のバージョンが必要な理由は、部分的にダウンロードされた画像のデータが必要だからです (特に画像が大きい場合)。パフォーマンスの問題を特定するために、部分的にダウンロードされたイメージを処理するコードを削除しました。

シミュレーターと iPad 3 でデバッグ モードとリリース モードでコードを実行し、LLVM と非 LLVM の両方のコンパイラ モードを試しました。遅延は、デバッグ/リリース、デバイス/シミュレーター、LLVM/非 LLVM のすべての構成で見られました。

4

2 に答える 2

0

こんにちは、あなたの質問に対する直接的な回答ではないかもしれませんが、Xamarin Component StoreのSDWebImageを試しましたか? これはOlivier Poitreyによって開発された素晴らしいライブラリであり、箱から出してすぐに非同期イメージ ダウンローダー、メモリ + ディスク イメージ キャッシュ、およびその他の利点を提供します。本当に素晴らしいです。

お役に立てれば

アレックス

于 2013-05-14T15:37:51.743 に答える