2013-11-03 5 views
4

tiltle는wpf에서 창을 닫을 때 이벤트 구독을 취소해야합니까?

this.Close() 

EventAggregator.OnUserLoggedIn -= OnUserLoggedIn; 
EventAggregator.OnUserLoggedOff -= OnUserLoggedOff; 
this.Close() 

내가했습니다 사이에 차이가 나는

EventAggregator.OnUserLoggedIn += OnUserLoggedIn; 
EventAggregator.OnUserLoggedOff += OnUserLoggedOff; 

이 내 창 (안 메인 창) 생성자에서, 모든 것을 말한다 창이 닫히면 모든 unmanged 리소스가 처분되며 해당 이벤트는 유보되거나 관리되지 않는 것으로 간주됩니까?

답변

5

이벤트는 관리 리소스입니다 (이벤트 리소스를 호출 할 수 있는지 여부는 확실하지 않습니다).

예, 자식 윈도우 (메인 윈도우는 중요하지 않음)에서 이벤트 핸들러를 푸는 것이 좋습니다. 그렇지 않으면 가비지 수집기가 참조를 가지고있는 객체를 선택할 수 없기 때문에 메모리 누수가 발생할 수 있습니다.

메모리 누수 및 이벤트 핸들러에 대한 추가 정보를 확인 this blog :

모든 .NET 응용 프로그램에 공통 고전 누출, 개발자에 의한 일반적인 감독. 다른 객체에서 발생하는 이벤트를 처리하는 이벤트 핸들러를 만든 경우 완료되면 링크를 지우지 않으면 원하지 않는 강력한 참조가 남게됩니다.

4

closing the main window이고 신청서를 제출하면 don't have to worry about unhooking the handler입니다. 프로세스와 관련된 모든 메모리는 프로세스가 종료되면 다시 사용할 수 있습니다.

여기에서 talking about secondary window이고 프로세스가 계속 실행되면 consider unhooking the events이어야합니다. EventAggregator가 메모리에 남아 있고 창 클래스에서 메모리 누수가 발생하는 한 창이 항상 메모리에 있기 때문입니다. Publisher (EventAggregator) will hold on to the subscriber object (window) as long as it stays in memory. 따라서 창 객체는 EventAggregator 객체의 수명과 함께 지속됩니다.

관련 문제