我很清楚事件訂閱和取消訂閱的語法。是否有明確的方式來確定哪些事件訂閱導致內存泄漏,哪些不會?
myEvent += myEventHandler; // subscribe
myEvent -= myEventHandler; // unsubscribe
我喜歡(包含在一個塊個體經營)事件預訂的lambda語法,但如果我需要退訂(以避免內存泄漏)我不能使用此語法。
因此,我的問題是什麼樣的事件需要取消訂閱,哪些可以忽略由GC來照顧? 舉例來說,我在UWP應用程序中使用以下內容,是否需要取消訂閱?如果是這樣,爲什麼?
- PointerMoved事件(Windows.UI.Xaml納秒)爲一個視圖頁面(在代碼隱藏)
- 在相同的命名空間一個訂閱頁面的從另一個網頁的事件。帶有事件的源頁面保持爲菜單容器,而訂閱頁面在用戶控制下導航。
我沒有標記它,但這似乎是[本文]的副本(http://stackoverflow.com/questions/4526829/why-and-how-to-avoid-event-handler-memory-泄漏)。如果發佈者的壽命比訂閱者長得多,那麼就會發生內存泄漏,因此,如果您的發佈者的範圍足以在所有訂閱者都不在範圍之內時消失,那麼您可以「讓GC處理取消訂閱」,正如Jon Skeet所說的在那個環節中,「通常我發現出版商和訂閱者的生活時間大致相同」。你說過,「但是我不能使用這個語法,如果我需要退訂」 - 爲什麼不呢? – Quantic
@Quantic - 回答最後一個問題:使用lambda語法,我假設取消訂閱是不可能的,但我可能是錯的。如果您知道使用lambda語法取消訂閱事件的語法,那麼我很感激。 – user2921851
感謝@Quantic的指針 - 是的,我可以看到一個副本。 – user2921851