【问题标题】:WPF UserControl Memory leakWPF UserControl 内存泄漏
【发布时间】:2011-03-19 09:42:32
【问题描述】:

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

但是我在任务管理器中注意到,经过多次交换后内存增加了。

使用 AntProfiler,我注意到 ToolBarAutomationPeer 引用了 UserControl

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

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

这似乎删除了UserControl 可能引用的任何AutomationPeer 实例,这些实例可能会将我正在交换的内容保留在内存中...

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

我不熟悉自动化调用,不确定它们何时有用。

【问题讨论】:

    标签: wpf memory user-controls memory-leaks


    【解决方案1】:

    我很想看到更多代码来尝试找出ToolBarAutomationPeer 出现的原因,但基本上自动化对等点是为了可访问性。屏幕阅读器和其他自动化工具可以使用自动化对等体来运行您的应用程序。常见用途是针对以某种方式存在障碍的人以及测试自动化工具。

    通过返回 null 就像你在上面一样,你会让你的 UserControl 完全无法被自动化访问。

    【讨论】:

      【解决方案2】:

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

      • 平板电脑输入服务(换句话说,所有“类似平板电脑”的电脑)
      • 自动化测试工具
      • 屏幕阅读器(和其他辅助功能软件)

      这使得 silverlight 变得一团糟,并导致许多错误,并且几乎总是让一切都像疯了一样泄漏。

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

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

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

      【讨论】:

        猜你喜欢
        • 2017-11-06
        • 2011-02-21
        • 1970-01-01
        • 2010-12-05
        • 2011-08-12
        相关资源
        最近更新 更多