嗨,我试图使用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和原来的对象被释放,有一个关于它的音符的此处

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top