【发布时间】:2013-10-09 06:27:22
【问题描述】:
我有一个 WPF MainWindow,可以在 StackPanel 中更改(导航)UserControl:
// on code behind of MainWindow
RootStackPanel.Children.Clear();
UserControl1 uc1= new UserControl1();
uc1.CustomizedEvent1+= EventHandler1;
uc1.CustomizedEvent2+= EventHandler2;
uc1.Loaded += (s, e1) =>
{
// Do something
};
// Unsubscribe external event to prevent memory leak
uc1.Unloaded += (s, e1) =>
{
uc1.CustomizedEvent1 -= EventHandler1;
uc1.CustomizedEvent2 -= EventHandler2;
};
RootStackPanel.Children.Add(uc1);
// same for UserControl 2,3,4....
应用程序将在运行几个小时后崩溃,所以我添加了带有匿名委托的 Unloaded 事件处理程序,以通过取消订阅 UserControl 的所有事件来防止内存泄漏。 Unloaded with Anonymous Delegate 会导致内存泄漏吗?如果是,如何在不调用 Unloaded 的情况下取消订阅 UserControl 的所有事件?
我记得像 Loaded, Unloaded 这样的内部事件会被 GC 处理掉吧?
匿名代表何时处置?
谢谢大家。
【问题讨论】:
-
只有在没有其他对象订阅 Unload 事件时,CG 才会收集用户控件。
-
嗨@PanagiotisLefas,所以我的解决方案很糟糕,因为 Unload 的匿名委托仍保留在 MainWindow 上,并且 GC 无法收集 UserControl。您对此有任何替代解决方案吗?谢谢
-
@QuocNguyen 你的解决方案很好
标签: wpf memory-leaks user-controls