안녕하세요, Microsoft.MSHTML (버전 7.0.3300.0) 라이브러리를 사용하여 HTML 문자열에서 본문 텍스트를 추출하려고합니다. 나는이 기능을 GetBody (string)라는 단일 도우미 메서드로 추상화했다.루프에서 Microsoft.MSHTML을 사용하면 메모리 누수가 발생합니다.
무한 루프에서 호출되면 프로세스가 결국 메모리가 부족해집니다 (작업 관리자의 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이었습니다.
MSHTML 자체가 내부적으로 유출되었을 수 있습니다. 정확히 얼마나 오래이 "무한 루프"가 실행되게 했습니까? – EricLaw
~ 500k 통화 동안 루프가 실행됩니다. 이 단계에서 메모리 사용량은 1.6GB에 도달하고 System.OutOfMemoryExceptions가 throw되기 시작합니다. – NoizWaves