WPF UserControl内存泄漏

时间:2010-07-22 07:10:55

标签: wpf memory user-controls memory-leaks

我在应用程序中有一个UserControl,我不断地将Content属性与其他UIElements交换。

然而,在一段时间后,我发现在任务管理中,内存在经过多次交换后上升......

使用AntProfiler我出于某种原因注意到UserControl引用的ToolBarAutomationPeer ....

要修复此内存泄漏,我使用以下代码创建了自己的usercontrol

public class MyUserControl : UserControl
{
    protected override System.Windows.Automation.Peers.AutomationPeer OnCreateAutomationPeer()
    {

        return null;        
    }

}

这似乎删除了usercontrol可能引用的任何AutomationPeers,它可能会保留我在内存中交换的内容......

但我仍然有兴趣知道ToolBarAutomationPeer是如何进入我的UserControl的,以及我在OnCreateAutomationPeer方法中返回null的后果是什么?

我不熟悉自动化呼叫,也不确定它们何时有用

由于

2 个答案:

答案 0 :(得分:2)

如果您的计算机上运行自动化客户端,自动化就会启动。最常见的是:

  • 平板电脑输入服务(换句话说,所有'平板电脑就像'个人电脑)
  • 自动化测试工具
  • 屏幕阅读器(和其他可访问性软件)

这使得Silverlight完全混乱并导致许多错误,并且几乎总是让一切都像疯了一样泄漏。

我通过在html中设置此参数来禁用自动化:

<param name="windowless" value="true" />

您可以在此处阅读更多内容:Silverlight + MVVM + Bindings = Memory leaks?

答案 1 :(得分:1)

我很想看到更多的代码来试图找出ToolBarAutomationPeer出现的原因,但基本上自动化对等体是可访问性的。屏幕阅读器和其他自动化工具可以使用自动化同行来运行您的应用程序。常见的用途是针对那些以某种方式残疾人并且还测试自动化工具的人。

通过像上面那样返回null,您可以完全无法访问自动化用户控件。