저는 WPF에 비교적 익숙하지 않습니다. Windows Forms과 달리 WPF 컨트롤 계층 구조는 IDisposable을 지원하지 않습니다. Windows Forms에서 사용자 정의 컨트롤이 관리되는 리소스를 사용하면 모든 컨트롤이 구현 한 Dispose 메서드를 재정 의하여 리소스를 정리하는 것이 매우 쉽습니다.WPF 사용자 컨트롤의 올바른 정리
WPF에서 이야기는 그렇게 단순하지 않습니다. WPF 컨트롤에 관리되지 않는 리소스가 없기 때문에 WPF에서 IDisposable을 구현하지 않는다는 Microsoft의 첫 번째 주제는 분명합니다. 이것이 사실 일지 모르지만 WPF 클래스 계층의 사용자 확장이 관리 된 리소스를 실제로 (모델을 통해 직접 또는 간접적으로) 사용할 수 있다는 사실을 완전히 놓친 것 같습니다. IDisposable을 구현하지 않으면 Microsoft는 사용자 지정 WPF 컨트롤이나 창에서 사용하는 관리되지 않는 리소스를 정리할 수있는 유일한 보장 된 메커니즘을 효과적으로 제거했습니다.
둘째, Dispatcher.ShutdownStarted에 대한 몇 가지 참조를 발견했습니다. ShutdownStarted 이벤트를 사용하려고했지만 모든 컨트롤에 대해 실행되지 않는 것 같습니다. WPF UserControl은 ShutdownStarted에 대한 핸들러를 구현했으며, 결코 호출되지 않습니다. Windows 또는 WPF App 클래스에서만 작동하는지 확실하지 않습니다. 그러나 제대로 발사되지 않습니다 및 응용 프로그램이 닫힐 때마다 열려있는 PerformanceCounter 개체가 누출되고 있습니다.
Dispatcher.ShutdownStarted 이벤트보다 관리되지 않는 리소스를 정리하는 것이 더 좋은 대안이 있습니까? Dispose가 호출되도록 IDisposable을 구현하는 데 필요한 트릭이 있습니까? 가능하다면 은 마무리자를 사용하여을 사용하지 않는 것이 좋습니다.
+1 코드를 사용하여 일회용 리소스를 이동합니다. WPF의 핵심 학습 포인트 중 하나는 코드 바인딩을 최소화하여 데이터 바인딩 아키텍처의 장점과 표현력을 활용하는 것입니다. 배울 수있는 고통스러운 일 (학습 곡선은 절벽을 오르는 것보다 낫지 만) WPF 생각 모드를 "얻을 때"보람을 느낍니다. –
모든 일회용 리소스는 실제로 IDisposable 인 ViewModel에 있습니다. Dispatcher.ShutdownStarted 이벤트가 실행되지 않는 이유에 대해 정말 혼란 스럽습니다. 성능 카운터 컨트롤 (및 관련 ViewModel)은 실제로에 포함되어 있으므로 에 WPF 그래프에 첨부됩니다. –
jrista
@Greg D : 일반적으로 WPF 모델을 얻습니다. WPF의 기본 사항을 파악하자마자 MVVM을 사용하기 시작했으며 CodeBehind는 기본적으로 InitializeComponent에 대한 기본 생성자 및 호출과 같이 매우 가볍습니다. WPF의 구성 가능성과 데이터 바인딩 기능은 놀라운 것 이상의 것이므로 선택하지 않으면 Windows 양식으로 돌아 가지 않을 것입니다. – jrista