嘿,我正在尝试使用Microsoft.MSHTML (版本7.0.3300.0)库从HTML字符串中提取正文文本。我已经将这个功能抽象到一个辅助方法GetBody(string)中。
在无限循环中调用时,该进程最终会耗尽内存(通过查看任务管理器中的Mem使用情况来确认)。我怀疑这个问题是由于我不正确地清理MSHTML对象造成的。我做错了什么?
我目前对GetBody(string)的定义是:
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赎回。
发布于 2010-01-07 12:04:59
我使用mshtml已经很久了,但是IHTMLElement2接口不是有close方法吗?你试过给它打电话了吗?
在泄漏明显之前,循环运行了多长时间?
我将查看是否可以深入挖掘此处使用mshtml的一些遗留代码,并查看开发人员是如何发布这些对象的。
编辑:
我们这里的旧代码在HTMLDocument2上调用close,然后释放com对象。
但是要注意的一件事是,ReleaseComObject方法是在循环中调用的,直到它返回零。这将确保所有的com包装器和原始对象都被释放,有一个关于它的注释here。
https://stackoverflow.com/questions/2017848
复制相似问题