【问题标题】:Unsubscribing from FrameworkElement event when removed删除时取消订阅 FrameworkElement 事件
【发布时间】:2019-04-21 03:42:36
【问题描述】:

我有一个附加属性,我在整个应用程序中的一堆控件上使用它。该属性订阅一个静态事件,并具有一个事件处理程序,其中附加属性绑定到的控件的某些属性被修改。

问题是这些控件中的一些被重新创建(例如,它们是可以关闭和重新打开的 ItemsControl 或 Window 的一部分),然后通过附加属性保存在内存中。在我的 WinForms 版本中,我订阅了已释放的事件,以便控件知道它何时被删除,然后取消订阅事件处理程序。但是,WPF 没有这样的事件。 Unloaded 当它被临时移除时会被调用(比如通过一个选项卡控件更改选项卡)。

那么当应该删除控件以避免内存泄漏时,如何删除这些控件引用?目前,如果我刷新我的一个页面,我的应用程序使用的内存会不断增加。

【问题讨论】:

  • 可能是FrameworkElement.Unloaded是退订其他事件的地方!
  • 正如我所提到的,Unloaded 事件是不可靠的。官方文档甚至提到在控件的整个生命周期中可以出于多种原因调用它。
  • 在 Loaded 事件中挂钩事件处理程序并在 Unloaded 事件中取消注册?或者使用弱引用。

标签: c# wpf events memory-leaks


【解决方案1】:

我找到了一个似乎可行的解决方案。我没有保存对控件的引用,而是将其设置在 WeakReference 对象中以允许垃圾收集器收集它。

【讨论】:

    猜你喜欢
    • 2019-07-19
    • 1970-01-01
    • 2018-01-05
    • 2021-02-24
    • 1970-01-01
    • 2017-03-07
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多