0

私のWP7アプリケーションでは、Webから200枚の画像をダウンロードし、独立したストレージに保存しました。デバッグすると、すべての画像がキュー方式でパノラマビューに読み込まれ、 pc。私はアプリケーションを開いて、いくつかの画像を表示し、終了画像をナビゲートすると、PCから切断後。多くの画像が表示されるとアプリケーションがクラッシュします

if (i < 150) 
    { 

     WebClient m_webClient = new WebClient();    
     Uri m_uri = new Uri("http://d1mu9ule1cy7bp.cloudfront.net/2012//pages/p_" + i + "/mobile_high.jpg"); 
     m_webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted); 
     m_webClient.OpenReadAsync(m_uri); 

    }   

void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
{ 
    int count; 

    try 
    { 
     Stream stream = e.Result;    
     byte[] buffer = new byte[1024]; 

     using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication()) 
     { 

      //isf.Remove(); 

      using (System.IO.IsolatedStorage.IsolatedStorageFileStream isfs = new IsolatedStorageFileStream("IMAGES" + loop2(k) + ".jpg", FileMode.Create, isf)) 
      { 
       count = 0; 

       while (0 < (count = stream.Read(buffer, 0, buffer.Length))) 
       { 
        isfs.Write(buffer, 0, count); 
       } 

       stream.Close(); 
       isfs.Close(); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString()); 
    } 
} 
+0

isolationStorageを使用する方法のコードを教えてください。 – ChapMic

+0

実際のデバイスで動作していますか? –

+0

はい、実際のデバイスのみです..私はisoストアから最初に3つの画像を追加し、選択されたイベントを使用して最初の画像を削除し、4番目の画像を追加するパノラマビューの画像をロードしました.. –

答えて

0

Skypeで話した後、彼のコードを見直し、自分のIsolated Storage Explorerで問題を発見しました。それは彼のPCに接続できませんでしたので、エラーが発生しました。画像の読み込みとは関係ありませんでした。

1

私はあなたの問題はあなたがループ内で使用すると、ループの外に出た瞬間を一度にあまりにも多くの画像を読み込むと、ビットマップ画像にUIスレッドに戻って、すべてのガベージコレクションをフォーカスを与える場合があるということだと思い完了しました。

This articleは少し上手く説明して解決策を提供します。

私もこの問題があり、私自身の解決策を考え出しました。私は読み込む必要のあるイメージURLを持つdictonairyを持っていましたが、あなたのシナリオでこれを簡単に変更することができます。

This SO question(複数の画像を読み込んでクラッシュ(例外))についても同様です。また、マイクロソフトの対応もあり、私の解決策はその回答に基づいています。

私の解決方法では、ディスパッチャを使用してUIスレッドに戻り、イメージとビットマップのゴミがきれいになっていることを確認しました。

private void LoadImages(List<string> sources) 
{ 
    List<string>.Enumerator iterator = sources.GetEnumerator(); 
    this.Dispatcher.BeginInvoke(() => { LoadImage(iterator); }); 
} 

private void LoadImage(List<string>.Enumerator iterator) 
{ 
    if (iterator.MoveNext()) 
    { 
     //TODO: Load the image from iterator.Current 

     //Now load the next image 
     this.Dispatcher.BeginInvoke(() => { LoadImage(iterator); }); 
    } 
    else 
    { 
     //Done loading images 
    } 
} 
+0

あなたは、 iso storeを使用しています。私のアプリケーションでは、ローカルディレクトリとファイルパスを持っている必要があります。 –

+0

私はあなたのシナリオに合わせて簡単にソリューションを変更できると言いました。 – SynerCoder

+0

あなたの問題に合わせてコードを書き直すことができますが、どのようにループするかを知る必要があります。 'loop2(k)'は何をしますか? 'k'とは何ですか?実際のロードループとは何ですか? – SynerCoder

0

私は、一度に200枚の画像を読み込むことがメモリに及ぼす影響には非常に注意します。メモリ使用量をプロファイリングしていますか?あまりにも多くのメモリを使用すると、アプリケーションが終了する可能性があります。

関連する問題