2011-07-08 2 views
7

Мне нужно динамически загружать много (иногда сотни) миниатюр. По соображениям производительности мне нужно сделать это в ограниченном количестве запросов, я использую один запрос/ответ для тестирования. Я отправляю двоичные данные для изображений в ответе и загружаю их в BitmapImage с использованием MemoryStream. Это работает правильно, пока я не загружу более 80 миниатюр, а затем получаю исключение «Катастрофическая ошибка». Чтобы убедиться, что мои данные не повреждены, я попытался несколько раз загрузить BitmapImage с одним и тем же массивом байтов, и он сработает после загрузки 80 или около того.Silverlight: BitmapImage из исключения исключений потоков (Катастрофический сбой (Исключение из HRESULT: 0x8000FFFF (E_UNEXPECTED)))

Ниже приведен пример того, как изображение загружается из массива байтов массив байтов, как известно, имеют действительные данные изображения (PNG):

private BitmapImage LoadImage(byte[] imageData) 
{ 
    BitmapImage img = new BitmapImage(); 
    MemoryStream stream = new MemoryStream(imageData); 
    img.SetSource(stream); // Exception thrown here after too many images loaded. 
    return img; 
} 

я затем использовать BitmapImage в качестве источника для Элемент изображения на странице, но ошибка возникает в строке img.SetSource(...) выше.

Добавление GC.Collect() в цикл, где я загружаю миниатюры, позволяет загружать еще несколько изображений, поэтому я думаю, что это имеет какое-то отношение к управлению памятью, но я не знаю, что я могу сделать, чтобы исправить проблему ,

+0

Я не уверен, что это может быть проблемой, но MemoryStream имеет свойства ReadTimeout и WriteTimeout. Может ли поток отключиться? – Danexxtone

+0

Я попытался установить ReadTimeout и получил исключение: таймауты не поддерживаются в этом потоке. – toby

+0

Можете ли вы прояснить несколько вещей: почему массив байтов? Нет ли потока из загружаемого файла, который вы могли бы напрямую подать на 'img.SetSource'?Вы уверены, что загружаемые png-файлы имеют размер «миниатюр» или вы загружаете большие изображения, которые масштабируются с помощью элемента управления изображением? Эти миниатюры фотографий? – AnthonyWJones

ответ

6

Я думаю, со ссылкой на ответ, обеспечивающий с помощью Microsoft в приведенном выше сообщении об ошибке стоит, так как это очень краткое и описательные проблем, а также предоставление рекомендуемого решения:

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

После обработки изображений 20 или около того вы можете остановить и поставить в очередь следующий набор, используя Dispatcher.BeginInvoke, чтобы разбить работу, которая обрабатывается в одной партии. Это позволит нам освобождать изображения, которые не сохраняются приложением.

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

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

0

Я отправил отчет об ошибке с Microsoft по этому вопросу: Catastrophic Failure exception thrown after loading too many BitmapImage objects from a Stream.

На данный момент я попытаюсь обойти это, используя меньшие файлы изображений для миниатюр и/или не загружая так много BitmapImages (выгружая изображения, когда они не находятся в области видимых областей и перезагружают их, когда они приходят в поле зрения).

 Смежные вопросы

  • Нет связанных вопросов^_^