【问题标题】:Possible memory leak while using AutomationElement Class使用 AutomationElement 类时可能存在内存泄漏
【发布时间】:2014-09-02 15:20:49
【问题描述】:

我正在编写一个程序,它将我的浏览历史记录在一个文本文件中。它从 chrome 窗口中获取 url 并将其写入文本文件。它获取 chrome 窗口句柄作为参数并将 url 写入 out 参数。代码如下所示:

static AutomationElement elm;// = AutomationElement.FromHandle(handle);
static AutomationElement elmUrlBar;  
public static void GetChromeUrl(IntPtr handle, out string url)
    {
        string namedProperty = "Address and search bar" ;
        url = null;
        elm = AutomationElement.FromHandle(handle);
        elmUrlBar = elm.FindFirst(TreeScope.Descendants,
          new PropertyCondition(AutomationElement.NameProperty, namedProperty));
        if (elmUrlBar != null)
        {
            AutomationPattern[] patterns = elmUrlBar.GetSupportedPatterns();
            if (patterns.Length > 0)
            {
                ValuePattern val = (ValuePattern)elmUrlBar.GetCurrentPattern(patterns[0]);
                url = val.Current.Value;
            }
        }
    }

我每隔 5 秒使用计时器回调调用此方法,它会从 chrome 浏览器窗口返回正确的 url。所以它工作得很好,尽管它似乎没有释放由 AutomationElement 对象占用的内存,并且此应用程序使用的 RAM 不断增长。我使用 dotMemory 4.0 和 ant memory profiler 8 对其进行了分析,它表明automationElement 对象已创建但从未被垃圾收集器删除。有人知道如何解决这个问题吗?

【问题讨论】:

  • 如果您要重构代码并将 AutomationElement 对象包装在 using(){} 语句周围会发生什么?你也可以实现IDisposible 吗?你也可以打电话给GC.Collect()

标签: c# .net browser memory-leaks ui-automation


【解决方案1】:

我目前工作的公司也遇到了这个问题。

这篇文章里面有问题的答案UIAutomation Memory Issue

您基本上需要从您正在自动化的应用程序中调用 GC,因为自动化元素将被添加到大型对象堆中,如果此时不存在指向它们的指针,则需要 3~ 分钟才能处理掉。

【讨论】:

  • 面临类似问题。如果可能,您能否分享您的解决方案代码?
  • @AwaisUmar 不幸的是,做我正在做的测试并不可行。自己调用GC.Collect() 不是一个好主意,您需要能够公开一些从测试应用程序到 AUT(被测应用程序)通信的方法来触发它。所有这些都将是非常有问题的。在遇到更多即使使用测试方法也无法解决的内存泄漏之后,我们最终在测试应用程序中内置了监控 AUT 内存消耗并在达到特定内存限制时重新启动它的能力。
  • @AwaisUmar 我们后来遇到的具体错误是,WPF 本身正在泄漏 AutomationElements,根据论坛帖子infragistics.com/community/forums/f/ultimate-ui-for-wpf/77267/… 中有关 Infragistics 控件的内容。此问题不仅限于基础设施,它与使用 ItemsControlAutomationPeer 的任何控件有关。如果您查找 6 年前 Brian Lagunas 的帖子,您也会看到我所指的问题。
  • @AwaisUmar 您可以在此文件referencesource.microsoft.com/#PresentationFramework/src/… 中看到 Brian 提到的错误,并且它至今仍然存在。本质上,他们使用的是弱引用,但他们使用对项目的强引用,因为它们是弱引用的关键,因此它永远不会被清理。例如,TreeViews 和 ListViews 之类的控件会发生这种情况,但我确信这不仅仅适用于这些控件。
  • @AwaisUmar 如果您对此提出问题,我会将所有这些内容移至该问题以获得更好的格式,但我认为在这里引用所有这些内容是不合适的。
猜你喜欢
  • 2017-12-25
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
  • 2012-09-23
  • 2020-06-12
相关资源
最近更新 更多