Утечка памяти в WPF в XP (CMilChannel, HWND) - PullRequest
4 голосов
/ 10 ноября 2009

В моем приложении 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"));

1 Ответ

6 голосов
/ 18 ноября 2009

Исправление:

Application.xaml.cs

class MyApp1 : Application
{
   // ...

   public Application()
   {
       new HwndSource(new HwndSourceParameters());
   }
   // ...
}
...