문제

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 랩퍼와 원래 객체가 해제되도록합니다. 여기.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top