Как изолировать утечки памяти Silverlight - PullRequest
5 голосов
/ 10 июня 2011

У меня утечка памяти в приложении 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 ]

1 голос
/ 09 июля 2011

Может ли это быть:

При каждом событии щелчка вы создаете ConfirmDialog объект, который может зависать после того, как он больше не используется.Можете ли вы создать это как переменную класса и иметь только одну ссылку и использовать ее вместо этого, когда вам нужно показать ChildWindow

1 голос
/ 21 июня 2011

Button.Command печально известен своей утечкой. Я предполагаю, что значение CancelActionCommand имеет ссылку на долгоживущий объект. Button не отсоединится от события ICommand.CanExecuteChanged. Вам следует подумать об использовании шаблона слабого события , чтобы ограничить площадь протекающей поверхности.

Вот лучшее объяснение и пример кода для решения проблемы.

...