【问题标题】:Simplest method of avoiding memory leaks in 2-window scenario2窗口场景下避免内存泄漏的最简单方法
【发布时间】:2013-03-29 03:40:12
【问题描述】:

我有两个窗口:一个 ma​​ster 窗口和一个 details 窗口,通过双击主窗口数据网格中的特定行打开。保存详细信息窗口中的数据时,我想刷新主窗口的数据网格控件。

(一些不相关的细节:每个窗口都继承自 BaseWindow 类,并且有自己的继承自 EF5 DbContext 的类的副本。我已将 Save 事件添加到部分类并覆盖 @987654325 @ 在调用 SaveChanges 时引发此事件。这实际上是我要附加事件处理程序的事件。)

我知道我可以通过将事件处理程序附加到Save 事件来做到这一点。但是,我不知道窗口将按什么顺序关闭 - 如果先关闭主窗口,详细信息窗口的实例仍然会保留对它的引用。

如果我监听主窗口的Closing'/'Closed 事件,以便知道何时释放附加到“保存”事件的处理程序,反过来我也会遇到同样的问题——主窗口将持有一个引用即使在详细信息窗口关闭后也可以转到详细信息窗口。

我知道我可以按照here 的描述实现WeakEventManager,但我想知道是否有更简单的技术可以使用。 (有人告诉我我有把事情复杂化的倾向。)

(我没有使用 MVVM。)

【问题讨论】:

    标签: wpf events memory-leaks


    【解决方案1】:

    WeakEventManager 可以完成这项工作,只需使用通用版本即可,没有什么复杂的。在您的情况下,性能方面应该非常好。

    如您所说,另一种选择是从主窗口中取消订阅主窗口Closing 上的事件处理程序。

    要在详细信息窗口关闭时删除所有引用,请在详细信息窗口关闭时取消订阅详细信息窗口内的所有事件处理程序,方法是将此方法订阅到 Closing 事件:

    public OnClosing()
    {       
        Delegate[] registeredDelegates = saveHandler.GetInvocationList();
        foreach (Delegate d in registeredDelegates )
           saveHandler-= (d as SaveDelegate);
    }
    

    其中 saveHandler 是您的处理程序,而 SaveDelegate 是您的自定义委托类型。

    话虽如此,如果你想摆脱过于复杂的形象,那就不要在意......

    【讨论】:

      猜你喜欢
      • 2017-05-16
      • 1970-01-01
      • 2018-04-08
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      相关资源
      最近更新 更多