我很清楚事件订阅和取消订阅的语法。是否有明确的方式来确定哪些事件订阅导致内存泄漏,哪些不会?
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