루프에서 Microsoft.mshtml 사용 메모리 누출
-
19-09-2019 - |
문제
HTML 문자열에서 바디 텍스트를 추출하기 위해 Microsoft.mshtml (버전 7.0.3300.0) 라이브러리를 사용하려고합니다. 이 기능을 단일 도우미 방법 GetBody (String)로 추상화했습니다.
무한 루프에서 호출되면, 프로세스는 결국 메모리가 부족합니다 (작업 관리자의 눈알을 끄는 MEM 사용으로 확인). 문제가 MSHTML 객체를 잘못 정리했기 때문이라고 생각합니다. 내가 뭘 잘못하고 있죠?
getbody (String)의 현재 정의는 다음과 같습니다.
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 값을 채우는 데 사용되는 코드로 추적되었습니다. 이 경우 전망 구속이었습니다.
해결책
MSHTML을 사용한 지 오랜 시간이 지났지 만 ihtmlelement2 인터페이스에 가까운 메소드가 없습니까? 당신은 그것을 부르려고 했습니까?
누출이 분명해지기 전에 루프가 얼마나 오래 실행 되었습니까?
MSHTML을 사용하는 일부 레거시 코드를 파헤칠 수 있는지 확인하고 개발자가 객체를 어떻게 공개하는지 확인할 수 있습니다.
편집하다:
우리가 여기에있는 이전 코드는 htmldocument2에서 닫고 com 객체를 릴리스합니다.
그래도 주목해야 할 것은 릴리스 에코 박사 방법이 0을 반환 할 때까지 루프에서 호출된다는 것입니다. 이렇게하면 모든 COM 랩퍼와 원래 객체가 해제되도록합니다. 여기.
제휴하지 않습니다 StackOverflow