Wpf 使用匿名委托加载/卸载事件时内存泄漏
我有一个WPF主窗口,可以在StackPanel中更改(导航)UserControl:Wpf 使用匿名委托加载/卸载事件时内存泄漏,wpf,memory-leaks,user-controls,Wpf,Memory Leaks,User Controls,我有一个WPF主窗口,可以在StackPanel中更改(导航)UserControl: // on code behind of MainWindow RootStackPanel.Children.Clear(); UserControl1 uc1= new UserControl1(); uc1.CustomizedEvent1+= EventHandler1; uc1.Customi
// 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....
应用程序在运行数小时后将崩溃,所以我添加了带有匿名委托的卸载事件处理程序,以通过取消订阅UserControl的所有事件来防止内存泄漏。
使用匿名委托卸载会导致内存泄漏吗?如果是,如何在不调用Unload的情况下取消订阅UserControl的所有事件
我记得内部事件如加载、卸载将由GC处理,对吗
匿名代理何时处理
谢谢大家。您说过“应用程序在运行数小时后将崩溃,所以我添加了卸载事件”-这是否意味着您经常更改(添加和删除)StackPanel中的UserControld?此外,每次创建新的UserControl时,都会从MainWindow添加这些事件处理程序,对吗
在这种情况下,您做得很好,将一个匿名委托分配给已卸载的事件进行清理是留下良好内存占用的正确方法 我找到了一个简单的解决方案来解决这个问题:
- 使用和EventHandler方法,而不是匿名委托
- 在EventHandler方法中调用Unsubscribe
..... // on code behind of MainWindow RootStackPanel.Children.Clear(); UserControl1 uc1= new UserControl1(); uc1.CustomizedEvent1+= EventHandler1; uc1.CustomizedEvent2+= EventHandler2; // Unsubscribe external event to prevent memory leak //uc1.Unloaded += (s, e1) => // { // uc1.CustomizedEvent1 -= EventHandler1; // uc1.CustomizedEvent2 -= EventHandler2; // }; RoutedEventHandler unloadedHandler = null; unloadedHandler = delegate(object s, RoutedEventArgs sev) { uc1.CustomizedEvent1 -= EventHandler1; uc1.CustomizedEvent2 -= EventHandler2; uc1.Unloaded -= unloadedHandler; }; uc1.Unloaded += unloadedHandler; RootStackPanel.Children.Add(uc1); // same for UserControl 2,3,4....