在循环中使用Microsoft.MSHTML,内存泄漏
-
19-09-2019 - |
题
嗨,我试图使用Microsoft.MSHTML(版本7.0.3300.0)库中提取从HTML字符串的正文文本。我已经抽象这个功能到一个单一的辅助方法GetBody(字符串)。
当在无限循环调用,过程最终耗尽存储器(目测在任务管理器内存使用确认)。我怀疑问题是由于我的MSHTML对象的不正确清理。我在做什么错了?
我的当前GetBody(串)的定义是:
public static string GetBody(string html)
{
mshtml.IHTMLDocument2 htmlDoc = null;
mshtml.IHTMLElement bodyElement = null;
string body;
try
{
htmlDoc = new mshtml.HTMLDocumentClass();
htmlDoc.write(html);
bodyElement = htmlDoc.body;
body = bodyElement.innerText;
}
catch (Exception ex)
{
Trace.TraceError("Failed to use MSHTML to parse HTML body: " + ex.Message);
body = email.Body;
}
finally
{
if (bodyElement != null)
Marshal.ReleaseComObject(bodyElement);
if (htmlDoc != null)
Marshal.ReleaseComObject(htmlDoc);
}
return body;
}
编辑:内存泄漏已被追踪到在填充HTML的值使用的代码。在这种情况下它是展望赎回。
解决方案
它一直以来我已经使用MSHTML了很长时间,但不将IHTMLElement2接口有密切的方法?你有没有打过电话吗?
有多久没在循环运行前的泄漏是显而易见的?
我会看看我是否可以通过一些遗留代码,我这里有一个使用MSHTML的挖,看看开发商是如何发布的对象。
编辑:
因为你拥有它的旧代码,我们在这里呼吁关闭HTMLDocument2然后释放COM对象上。
有一两件事要注意的是,该ReleaseComObject的方法被称为在一个循环中,直到它返回零。这将确保所有的COM wrapers和原来的对象被释放,有一个关于它的音符的此处。
不隶属于 StackOverflow