嘿,我正在尝试使用Microsoft.MSHTML(版本7.0.3300.0)库从HTML字符串中提取正文。我已将此功能抽象为单个辅助方法GetBody(string)。
在无限循环中调用时,进程最终会耗尽内存(通过在任务管理器中监视Mem Usage来确认)。我怀疑问题是由于我对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值时使用的代码。在这种情况下,它是Outlook Redemption。
答案 0 :(得分:2)
我使用mshtml已经很长时间了,但是IHTMLElement2接口是不是有一个close方法?你试过打电话吗?
在泄漏明显之前,循环运行了多长时间?
我将看看我是否可以挖掘一下我在这里使用mshtml的一些遗留代码,看看开发人员如何发布这些对象。
编辑:
我们这里的旧代码在HTMLDocument2上调用close,然后释放com对象。
需要注意的一点是,ReleaseConObject方法在循环中被调用,直到它返回零。这将确保释放所有com包装器和原始对象,并且有关于它的注释here。