Использование Microsoft.MSHTML в цикле, утечка памяти

Привет, я пытаюсь использовать библиотеку Microsoft.MSHTML (версия 7.0.3300.0) для извлечения основного текста из строки HTML. Я абстрагировал эту функциональность в один вспомогательный метод GetBody(string).

При вызове в бесконечном цикле процессу в конечном итоге не хватает памяти (что подтверждается с помощью использования Mem Mem в диспетчере задач). Я подозреваю, что проблема связана с моей неправильной очисткой объектов 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 ответ

Решение

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

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

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

РЕДАКТИРОВАТЬ:

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

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

Другие вопросы по тегам