В моем приложении WPF происходит утечка памяти со скоростью около 4 Кбит / с. Использование памяти в диспетчере задач постоянно увеличивается, пока не произойдет сбой приложения с исключением «Недостаточно памяти».
Проведя собственное исследование, я обнаружил, что проблема обсуждается здесь: Отслеживание утечки памяти в WPF и № 8 здесь: http://blogs.msdn.com/jgoldb/archive/2008/02/04/finding-memory-leaks-in-wpf-based-applications.aspx
Описанная проблема:
Это утечка в WPF, присутствующая в версиях платформы вплоть до .NET 3.5 SP1. Это происходит из-за способа, которым WPF выбирает, какой HWND использовать для отправки сообщений из потока рендеринга в поток пользовательского интерфейса. Этот образец уничтожает первый созданный HWND и запускает анимацию в новом окне. Это приводит к тому, что сообщения, отправляемые из потока рендеринга, накапливаются без обработки, что приводит к утечке памяти.
Предлагаемое решение:
Обходной путь - сначала создать новый HwndSource в своем конструкторе класса App. Это ДОЛЖНО быть создано до того, как WPF создаст любой другой HWND. Просто создав этот HwndSource, WPF будет использовать его для отправки сообщений из потока рендеринга в поток пользовательского интерфейса. Это гарантирует, что все сообщения будут обработаны, и что ни одно из них не будет пропущено.
Но я не понимаю решения!
У меня есть подкласс Application, который я использую, и я попытался создать окно в этом конструкторе, но это не решило проблему.
Следуя буквальным инструкциям, похоже, мне просто нужно добавить это в конструктор приложения:
new HwndSource(new HwndSourceParameters("MyApplication"));