显示大量图像时应用程序崩溃

时间:2012-03-08 12:28:35

标签: silverlight-4.0 windows-phone-7.1 windows-phone-7 isolatedstorage

在我的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());
    }
}

3 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分:0)

在Skype上讨论后,我查看了他的代码,发现他的问题出在他的Isolated Storage Explorer上。它无法连接到他的电脑,所以它给出了一个错误。与图像加载无关。

答案 2 :(得分:0)

我非常警惕一次加载200张图片的内存含义。你有没有分析内存使用情况?使用太多内存可能会导致应用程序被终止。