【问题标题】:How to Isolate Silverlight Memory Leaks如何隔离 Silverlight 内存泄漏
【发布时间】:2011-09-12 01:49:39
【问题描述】:

我在 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实例后都没有释放它??

【问题讨论】:

  • 你怎么知道内存肯定泄漏了?你真的能看到内存消耗在增加吗? (在哪里?)
  • 我已经更新了问题。 ConfirmDialog 不会在每次创建和关闭对话框时都被释放。

标签: silverlight silverlight-4.0 memory-leaks telerik


【解决方案1】:

Button.Command 因泄露而臭名昭著。我的猜测是值CancelActionCommand 引用了一个长寿对象。 Button 不会从 ICommand.CanExecuteChanged 事件中解脱。您应该考虑使用Weak Event Pattern 来限制您的可泄漏表面积。

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

【讨论】:

  • 对于我们的整个应用程序,您可能是正确的,但是对于上面这个特定的代码 sn-p,我只是从我们的应用程序中复制并粘贴了一些代码。那里的实际命令不受任何约束。没有视图模型。
  • 值得一试... Styles.xaml 或其他 ResourceDictionary 中是否存在隐式应用于窗口或按钮的内容?
  • 这很有趣。我所做的只是创建一个空白的 silverlight 4 解决方案。从我们的主产品复制到上面的子窗口中,删除子窗口中的一些其他内容,就是这样。没有样式或任何东西。
  • 不错。那里是真正的信心建设者。
  • 这对于微软来说可能是一个更好的问题。他们继续像这样建造无用的污物,破坏互联网。您不能使用 Flash 或 HTML5 或两者都构建您的应用程序吗?
【解决方案2】:

可能是:

在每次单击事件时,您都在创建 ConfirmDialog 对象,该对象在不再使用后可能会挂起。您能否将其创建为类变量并且只有一个引用并在需要显示ChildWindow时使用它来代替@

【讨论】:

  • 它为什么会闲逛?也许你是对的,但只是更多地探索这个想法。我离开并以一种或另一种方式衡量如何。注意这个空间。
  • 扫描线程 5 OSTHread 11c4 扫描线程 34 OSTHread 12f8 扫描线程 35 OSTHread 108c DOMAIN(07581358):HANDLE(Pinned):81d12f8:Root: 0ce74260(System.Object[])-> 0be86958(System .Collections.Generic.List`1[[System.Object, mscorlib]])-> 0befcbc4(System.Object[])-> 0bf17df4(MemoryLeakTesting2.ConfirmDialog)
  • 对不起 - 这看起来很糟糕,但赏金很快就会结束。我认为你是对的,它被保持打开状态,上面是保持它打开状态的堆栈跟踪。我不明白是什么让它打开了?
  • @peter: 请参阅 ChildWindow 内存泄漏 (silverlight.codeplex.com/workitem/4753?ProjectName=silverlight) - 出于某种原因,我认为这会在 SL4 中得到修复,但也许不会……如果我遇到问题我会更新它有趣。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多