Я относительно новичок в 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 App. Однако он не срабатывает должным образом, и каждый раз, когда приложение закрывается, я запускаю открытые объекты PerformanceCounter.
Есть ли лучшая альтернатива очистке неуправляемых ресурсов, чем событие Dispatcher.ShutdownStarted? Есть ли какой-то трюк для реализации IDisposable, который вызывается Dispose? Я бы предпочел избегать с помощью финализатора, если это вообще возможно.