2013-11-03 50 views
4

的本標題說,這一切,在我的窗口(而不是主窗口)構造我有當我在wpf中關閉窗口時,是否必須取消訂閱活動?

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

this.Close() 

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

我之間的差異閱讀關閉窗口處理所有無人管理的資源,這些事件是否被視爲猥褻或不受管理?

回答

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。所以,window對象將會持續EventAggregator對象的生命週期。

相關問題