在循环中使用Microsoft.MSHTML,内存泄漏

时间:2010-01-07 02:33:04

标签: c# .net mshtml microsoft.mshtml

嘿,我正在尝试使用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。

1 个答案:

答案 0 :(得分:2)

我使用mshtml已经很长时间了,但是IHTMLElement2接口是不是有一个close方法?你试过打电话吗?

在泄漏明显之前,循环运行了多长时间?

我将看看我是否可以挖掘一下我在这里使用mshtml的一些遗留代码,看看开发人员如何发布这些对象。

编辑:

我们这里的旧代码在HTMLDocument2上调用close,然后释放com对象。

需要注意的一点是,ReleaseConObject方法在循环中被调用,直到它返回零。这将确保释放所有com包装器和原始对象,并且有关于它的注释here