Использование Microsoft.MSHTML в цикле, утечка памяти - PullRequest
3 голосов
/ 07 января 2010

Эй, я пытаюсь использовать библиотеку 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 Ответ

2 голосов
/ 07 января 2010

Прошло много времени с тех пор, как я использовал mshtml, но разве интерфейс IHTMLElement2 не имеет метода close? Вы пытались это назвать?

Как долго цикл работал до того, как утечка стала очевидной?

Я посмотрю, смогу ли я покопаться в унаследованном здесь коде, использующем mshtml, и посмотрю, как разработчики выпустили объекты.

EDIT:

Старый код, который у нас здесь, вызывает закрытие HTMLDocument2, а затем освобождает объект com, как он есть.

Следует отметить, что метод ReleaseComObject вызывается в цикле, пока не вернет ноль. Это обеспечит освобождение всех упаковщиков и исходного объекта, здесь есть примечание .

...