如何隔离Silverlight内存泄漏

时间:2011-06-09 21:31:17

标签: silverlight silverlight-4.0 memory-leaks telerik

我在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,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实例??

2 个答案:

答案 0 :(得分:1)

Button.Command因泄漏而臭名昭着。我的猜测是值CancelActionCommand具有对长寿命对象的引用。 Button不会取消ICommand.CanExecuteChanged事件。您应该考虑使用Weak Event Pattern来限制可漏表面积。

Here is a better explanation and example code to fix the problem.

答案 1 :(得分:1)

可能是:

在每次点击活动中,您正在创建ConfirmDialog对象,该对象在不再使用后可能会挂起。您是否可以将其创建为类变量并且只有一个引用,并在需要显示ChildWindow

时使用它