Как повысить производительность приложения WPF - PullRequest
3 голосов
/ 21 мая 2009

Я разработал приложение WPF. В этом приложении я загружаю 200 МБ фотографий в список. После этого я добавляю эти изображения на холст. При добавлении фотографий на холст через некоторое время (т. Е. После добавления 10 МБ изображений) я получаю некоторую ошибку, например ----

***** CLR не удалось перейти из контекста COM 0x10b46f0 в контекст COM 0x10b4860 в течение 60 секунд. Поток, которому принадлежит целевой контекст / квартира, скорее всего, либо делает ожидание без перекачки, либо обрабатывает очень длительную операцию без перекачки сообщений Windows. Эта ситуация, как правило, оказывает негативное влияние на производительность и может даже привести к тому, что приложение перестает отвечать на запросы или использование памяти постоянно увеличивается с течением времени. Чтобы избежать этой проблемы, все потоки однопотоковых квартир (STA) должны использовать примитивы перекачки (такие как CoWaitForMultipleHandles) и регулярно перекачивать сообщения во время длительных операций. *****

Есть ли способ повысить производительность моего приложения. Мне нужно решение этой проблемы.

Любые предложения для этого.

Ответы [ 3 ]

5 голосов
/ 21 мая 2009

Не загружайте все 200 МБ фотографий сразу в список в вашей ветке пользовательского интерфейса. Будет ли пользователь смотреть на 200 мб сразу? Это потребует некоторой работы с вашей стороны, но вам понадобится выполнить некоторую отложенную загрузку изображений из фонового потока.

3 голосов
/ 21 мая 2009

Взгляните на эту статью (Продвинутые методы для предотвращения и обнаружения взаимоблокировок в приложениях .NET), это может помочь.

0 голосов
/ 22 мая 2009

Это похоже на два вопроса, первый - вы загружаете изображения в фоновом потоке, но не делаете это правильно; Таким образом, ошибка COM. Дважды проверьте, что у вас есть приложение STAThread и что поток загрузки изображений неправильно взаимодействует с потоком отправки WPF. Вот обсуждение MTA vs. STA; тем не менее, WPF нужна STA, и сражение с ним проигрышно.

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

Вот несколько документов по использованию view-model . Модель представления может координировать загрузку изображения и предоставлять ListView источник привязки, который автоматически заставит приложение работать.

Более простой альтернативой может быть запуск фонового потока и загрузка изображений в ObservableCollection <>, привязка этого к ListView и разрешение каркасу работы с дисплеем.

Я второй, что сказал Грег Д., загрузка 200 Мб изображений звучит как рецепт для проблем.

...