我在Silverlight应用程序中有内存泄漏,我使用此信息开始,
哪个很棒.我已经提取了一些代码来解决这个问题.所以代码看起来像这样,一个子窗口,
<controls:ChildWindow x:Class="MemoryLeakTesting2.ConfirmDialog" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls" xmlns:telerik="clr-namespace:Telerik.Windows.Controls;assembly=Telerik.Windows.Controls" Width="375" > <Grid Margin="2"> <telerik:RadButton Content="OK" Click="OnClick" Command="{Binding CancelActionCommand}" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,0" Grid.Row="1" /> </Grid> </controls:ChildWindow>
背后的代码就是这个,
public partial class ConfirmDialog : ChildWindow { public ConfirmDialog() { InitializeComponent(); } [SuppressMessage("Microsoft.Performance","CA1811:AvoidUncalledPrivateCode")] private void OnClick(object sender,RoutedEventArgs e) { DialogResult = true; } }
我从我的主要silverlight页面中的按钮点击事件中调用此代码,如下所示,
private void Button_Click(object sender,RoutedEventArgs e) { ConfirmDialog dialog = new ConfirmDialog(); dialog.Show(); }
每次打开弹出窗口并关闭它时都会泄漏内存.我使用WinDbg,它实际上表明每次弹出和关闭后都不会释放ConfirmDialog实例?
解决方法
Button.Command因泄漏而臭名昭着.我的猜测是,值CancelActionCommand具有对长寿命对象的引用. Button不会从ICommand.CanExecuteChanged事件中取消挂钩.您应该考虑使用
Weak Event Pattern来限制可漏表面积.
Here is a better explanation and example code to fix the problem.