Я относительно новичок в WPF, и некоторые вещи, связанные с ним, мне совершенно чужды. Во-первых, в отличие от Windows Forms, иерархия элементов управления WPF не поддерживает IDisposable. В Windows Forms, если пользовательский элемент управления использовал какие-либо управляемые ресурсы, было очень легко очистить ресурсы, переопределив метод Dispose, реализованный в каждом элементе управления.
В WPF все не так просто. Я искал это несколько часов и наткнулся на две основные темы:
Первая тема - это Microsoft, четко заявляющая, что WPF не реализует IDisposable, поскольку элементы управления WPF не имеют неуправляемых ресурсов. Хотя это может быть правдой, они, похоже, полностью упустили тот факт, что пользовательские расширения в их иерархии классов WPF действительно могут использовать управляемые ресурсы (прямо или косвенно через модель). Не реализовав IDisposable, Microsoft фактически удалила единственный гарантированный механизм, с помощью которого можно очистить неуправляемые ресурсы, используемые настраиваемым элементом управления WPF или окном.
Во-вторых, я нашел несколько ссылок на Dispatcher.ShutdownStarted. Я попытался использовать событие ShutdownStarted, но оно не срабатывает для каждого элемента управления. У меня есть куча WPF UserControl, я реализовал обработчик для ShutdownStarted, и он никогда не вызывается. Я не уверен, работает ли он только для Windows или, возможно, для класса приложения WPF. Однако он не срабатывает должным образом, и я сливаю открытые объекты PerformanceCounter каждый раз, когда приложение закрывается.
Есть ли лучшая альтернатива очистке неуправляемых ресурсов, чем событие Dispatcher.ShutdownStarted? Есть ли какой-нибудь трюк для реализации IDisposable, при котором будет вызываться Dispose? Я бы предпочел избегать использования финализатора, если это вообще возможно.