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 2012-03-08 12:30:22

+0

在真实设备上运行呃? – 2012-03-08 12:39:01

+0

是只在真实的设备中..我已经加载全景视图中的图像首先添加了3个图像从iso商店和使用选择更改事件删除第一个图像,并添加第四个图像vicecersa .. – 2012-03-08 12:41:27

回答

0

在Skype上交谈之后,我回顾了他的代码,发现他的问题与他的Isolated Storage Explorer有关。它无法连接到他的电脑,所以它给了一个错误。与图片加载无关。

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存储..为我的应用程序它的必须为我有一个本地目录和文件路径 – 2012-03-08 12:53:20

+0

我没有说,我说你可以很容易地改变我的解决方案,以适应你的情况。 – SynerCoder 2012-03-08 12:58:34

+0

我可以重写我的代码来适应你的问题,但是我需要知道你如何循环它。 'loop2(k)'做了什么?什么是'k'?什么是实际加载循环? – SynerCoder 2012-03-08 13:00:13

0

我会非常警惕一次加载200张图片的内存影响。你是否在分析内存使用情况?使用太多内存可能会导致您的应用程序被终止。

相关问题