Очередь финализатора
Ответ на вопрос об очереди финализатора состоит в том, что наблюдаемый эффект не является постоянным: финализация просто не была закончена в тот момент, когда я проанализировал память. Проблема здесь состоит в том, чтобы понять инструмент (и окружающую среду), который я использовал.
Утечка памяти
Сама утечка, однако, была реальной проблемой, и оказалось, что это было то же самое , которое я также наблюдал в других местах (в том же приложении). Привязки к CLR-свойствам классов, не реализующих INotifyPropertyChanged ! http://support.microsoft.com/kb/938416/en-us
Это был один из моих первых проектов WPF, а за это время он превратился в огромное приложение. В то время, когда я начинал, я не знал, что у WPF есть проблемы с привязками, упомянутыми выше, и во время разработки я пытался сделать как можно больше с привязкой данных, но мне было наплевать на целевые объекты. Теперь, когда приложение стало настолько большим и число клиентов резко возросло, эти проблемы с памятью обнаружились (и привели к очень странным эффектам).
После устранения наиболее проблемных привязок эффект, связанный с очередью финализатора, значительно снизился. Похоже, что раньше утечки памяти приводили к отложенному выполнению завершения объекта (это только предположение, я не углублялся в GC-поведение).
Производные текстовые поля:
Я создал небольшой пример проекта с такими производными элементами управления текстовыми полями, используя их в некоторых стресс-тестах в профилировщике памяти. Насколько я могу судить по моим наблюдениям за тестовым проектом, производные от TextBoxes работают очень хорошо.
Fazit
Я могу только подчеркнуть важность проверки целевых объектов Привязок при создании приложения. В противном случае, будет много работы по выявлению мест утечки в приложении. Я надеюсь, что это объяснение поможет кому-то не делать те же ошибки, что и я.