Размер ElementHost вызывает медленное открытие / загрузку wpf с высоким использованием памяти

Эта проблема:

У нас есть приложение Winforms, которое может открыть другое окно WPF. Это окно содержит различные значки и текст и не слишком сложно. Возвращаясь к главному окну, winforms, оно также имеет элемент управления WPF, встроенный с использованием ElementHost(ElementHost специально разработан для того, чтобы Winforms могли размещать элемент управления WPF). Однако мы заметили, что, как только использование памяти этим приложением становится достаточно высоким, это второе окно WPF может открываться довольно долго.

Мы сделали небольшое тестовое приложение в VS2012, которое способно воспроизвести проблему. Тестовое приложение открывает окно Winforms, которое имеет две кнопки; "Добавить 4 ГБ памяти" и "Открыть окно WPF". Окно WPF имеет один маленький значок (48*48), и это все. Когда мы добавляем использование памяти в 4 Гб и пытаемся открыть окно в первый раз, открытие окна занимает около 7 секунд.

КОД: Я сделал тестовое приложение и исходный код общедоступными через BitBucket.

Вещи, которые мы узнали:

  • Приложение определенно работает в 64-битном режиме, поскольку оно генерирует исключения OutOfMemoryException в 32-битном режиме.
  • Без использования памяти окно открывается сразу.
  • При использовании памяти окно работает медленно только при первом открытии.
  • Если в окне WPF нет изображения, оно открывается немедленно.
  • При уменьшении размера элемента-элемента, который находится на элементе управления winforms, скажем, 1*1, окно открывается немедленно. Очевидно, что это не очень хорошее решение, так как оно не показывает большую часть нашего WPF Control при таком размере.
  • Размер ElementHost в нашем приложении составляет около 1000*700, но мы заметили, что при уменьшении размера ElementHost есть большая точка пропуска, поэтому это займет 10 секунд, пока не достигнет 350*350, после чего внезапно улучшается, чтобы быть быстрым снова. Это может зависеть от компьютера, или может быть какое-то ограничение.
  • Удаление изображения из окна wpf сделает его снова быстрым.
  • Добавление новых изображений в качестве ресурсов и в окне WPF линейно замедляет время открытия (например, 1 изображение = 7 секунд, 2 изображения = 14 секунд).
  • Экспериментировал с тем, чтобы убедиться, что изображение имеет тот же размер, в котором оно отображается, поэтому не должно быть никакого изменения размера, но это, похоже, не имеет никакого значения.
  • Экспериментировал с разными типами изображений,.png,.tiff,.ico, но все они выглядели медленными.

Кто-нибудь еще сталкивался с этой проблемой / какие-либо предложения о том, каким может быть наш следующий шаг?

1 ответ

После некоторого дополнительного анализа с использованием профилировщика эта статья, похоже, стала той же проблемой, что и я.

typeof(BitmapImage).Assembly.GetType("MS.Internal.MemoryPressure")
.GetField("_totalMemory", BindingFlags.NonPublic | BindingFlags.Static)
.SetValue(null, Int64.MinValue / 2); 

Не самое хорошее решение, но оно определенно решило проблему.

Другие вопросы по тегам