【发布时间】:2016-09-26 17:27:09
【问题描述】:
我非常了解事件订阅和取消订阅的语法。
myEvent += myEventHandler; // subscribe
myEvent -= myEventHandler; // unsubscribe
我喜欢事件订阅的 lambda 语法(自身包含在一个块中),但如果我需要取消订阅(以避免内存泄漏),我不能使用此语法。
因此,我的问题是,哪些事件需要取消订阅,哪些事件可以忽略以由 GC 处理? 例如,我将以下内容用于 UWP 应用,它们是否需要取消订阅,如果需要,为什么?
- View 页面的 PointerMoved 事件 (Windows.UI.Xaml ns)(在代码隐藏中)
- 来自与订阅页面相同命名空间中的另一个页面的事件。带有事件的源页面作为菜单容器保留,而订阅页面在用户控制下导航。
【问题讨论】:
-
我没有标记它,但这似乎与this post 重复。当发布者的生存时间比订阅者长得多时,就会发生内存泄漏,因此如果您的发布者的范围是这样的,那么您可以“让 GC 处理取消订阅”,以便在所有订阅者也都超出范围后不久它就会消失 - 正如 Jon Skeet 所说在那个链接中,“通常我发现发布者和订阅者的生命周期大致相同”。你说,“但如果我需要取消订阅,我不能使用这种语法”——为什么不呢?
-
@Quantic - 回答您的最后一个问题:使用 lambda 语法,我假设无法取消订阅,但我可能是错的。如果您知道使用 lambda 语法取消订阅事件的语法,我将不胜感激。
-
感谢@Quantic 的指点——是的,我可以看到一个副本。
-
哦,我对其他语法感到困惑。如果您保留对委托的引用,则有一种方法,如 here 所示。
标签: c# events memory-leaks windows-runtime uwp