我正在编写一个程序,将我的浏览历史记录在一个文本文件中。它从Chrome窗口中获取网址并将其写入文本文件。它获取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内存探查器8对它进行了剖析,它显示了automationElement对象已创建,但从未被垃圾收集器删除。有人知道如何解决此问题吗?
我目前工作的公司也遇到了这个问题。
本文对此问题做了解答UIAutomation内存问题
从根本上讲,您无需从要执行自动化的应用程序中调用GC,因为如果此时没有指向它们的指针,自动化元素将被添加到大对象堆中,并且需要3分钟的时间才能被处理掉。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句