首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在循环中使用Microsoft.MSHTML,内存泄漏

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

Stack Overflow用户
提问于 2010-01-07 10:33:04
回答 1查看 2.6K关注 0票数 3

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

在无限循环中调用时,该进程最终会耗尽内存(通过查看任务管理器中的Mem使用情况来确认)。我怀疑这个问题是由于我不正确地清理MSHTML对象造成的。我做错了什么?

我目前对GetBody(string)的定义是:

代码语言:javascript
复制
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赎回。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-01-07 12:04:59

我使用mshtml已经很久了,但是IHTMLElement2接口不是有close方法吗?你试过给它打电话了吗?

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

我将查看是否可以深入挖掘此处使用mshtml的一些遗留代码,并查看开发人员是如何发布这些对象的。

编辑:

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2017848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档