代码之家  ›  专栏  ›  技术社区  ›  NoizWaves

在循环中使用microsoft.mshtml,内存泄漏

  •  3
  • NoizWaves  · 技术社区  · 15 年前

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

    1 回复  |  直到 15 年前
        1
  •  2
  •   Glenn    15 年前

    我已经很久没有使用过MSHTML了,但是IHTMlement2接口不是有一个关闭方法吗?你试过打电话给它吗?

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

    我将看看我是否能挖掘出一些使用MSHTML的遗留代码,看看开发人员是如何发布这些对象的。

    编辑:

    我们这里的旧代码调用了htmldocument2上的close,然后在拥有它时释放com对象。

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