Сбой приложения при отображении большого количества изображений - PullRequest
0 голосов
/ 08 марта 2012

В моем приложении WP7 я скачал 200 изображений из Интернета и сохранил их в изолированном хранилище. При отладке все изображения загружаются в виде панорамы методом очереди, и я могу видеть, когда он подключен к компьютеру. после отключения его от ПК, когда я открываю приложение и перемещаюсь по изображениям, оно показывает некоторые изображения и прекращается.

    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 ]

1 голос
/ 08 марта 2012

Я думаю, что ваша проблема в том, что если вы загружаете слишком много изображений одновременно в цикле в тот момент, когда вы выходите из цикла и возвращаете фокус на поток пользовательского интерфейса, то вся сборка мусора на растровых изображениях завершена.

Эта статья объясняет это немного лучше и предлагает решение.

У меня тоже была эта проблема, и я нашел собственное решение. У меня был dictonairy с URL-адресом изображения, который нужно было загрузить, но вы можете легко изменить это для своего сценария.

Этот вопрос SO также касается этой проблемы (загрузка нескольких изображений и сбой (исключение)). У него также есть ответ от Microsoft, я основал свое решение на их ответе.

В моем решении я использую диспетчер, чтобы вернуться к потоку пользовательского интерфейса и, таким образом, убедиться, что мусор использованного изображения и растровых изображений был очищен.

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 голосов
/ 08 марта 2012

Я бы очень остерегался последствий для памяти при загрузке 200 изображений одновременно. Вы профилировали использование памяти? Использование слишком большого объема памяти может привести к прекращению работы приложения.

0 голосов
/ 08 марта 2012

После разговора по Skype я просмотрел его код и обнаружил, что его проблема связана с его изолированным хранилищем. Он не мог подключиться к своему компьютеру, поэтому выдал ошибку. Не имеет ничего общего с загрузкой изображения.

...