3

嘿,我正在尝试使用 Microsoft.MSHTML(版本 7.0.3300.0)库从 HTML 字符串中提取正文。我已将此功能抽象为单个辅助方法 GetBody(string)。

当在无限循环中调用时,该进程最终会耗尽内存(通过在任务管理器中查看 Mem Usage 来确认)。我怀疑问题是由于我对 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 Redemption。

4

1 回答 1

2

很久没用mshtml了,但是IHTMLElement2界面不是有close方法吗?你试过打电话吗?

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

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

编辑:

我们这里的旧代码在 HTMLDocument2 上调用 close 然后释放 com 对象,就像你拥有它一样。

不过要注意的一点是,ReleaseComObject 方法在循环中被调用,直到它返回零。这将确保所有 com 包装器和原始对象都被释放,这里有一个关于它的注释

于 2010-01-07T04:04:58.980 回答