使用AutomationElement类时可能发生内存泄漏

时间:2014-09-02 15:20:49

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

我正在编写一个程序,将我的浏览历史记录记录在文本文件中。它从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和ants memory profiler 8对其进行了分析,它显示自动化元素对象已创建但从未被垃圾收集器删除。有人知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

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

本文解答了其中的问题UIAutomation Memory Issue

您基本上需要从您正在自动化的应用程序中调用GC,因为自动化元素将被添加到大对象堆中,如果此时没有指针,则需要处理3分钟。