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