如何隔离Silverlight内存泄漏

我在Silverlight应用程序中有内存泄漏,我使用此信息开始,

http://blogs.msdn.com/b/slperf/archive/2010/08/19/analyzing-silverlight-memory-usage-part-1-obtaining-measurements.aspx

哪个很棒.我已经提取了一些代码来解决这个问题.所以代码看起来像这样,一个子窗口,

<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.

相关文章

如何在Silverlight4(XAML)中绑定IsEnabled属性?我试过简单的...
我正在编写我的第一个vb.net应用程序(但我也会在这里标记c#,...
ProcessFile()是在UIThread上运行还是在单独的线程上运行.如...
我从同行那里听说,对sharepoint的了解对职业生涯有益.我们不...
我正在尝试保存一个类我的类对象的集合.我收到一个错误说明:...
我需要根据Silverlight中的某些配置值设置给定控件的Style.我...