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