2010-01-07 7 views
3

안녕하세요, 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이었습니다.

+0

MSHTML 자체가 내부적으로 유출되었을 수 있습니다. 정확히 얼마나 오래이 "무한 루프"가 실행되게 했습니까? – EricLaw

+0

~ 500k 통화 동안 루프가 실행됩니다. 이 단계에서 메모리 사용량은 1.6GB에 도달하고 System.OutOfMemoryExceptions가 throw되기 시작합니다. – NoizWaves

답변

2

mshtml을 사용한 지 오래되었지만 IHTMLElement2 인터페이스에 가까운 방법이 있습니까? 전화 해봤습니까?

루프가 누출되기 전에 얼마나 오래 실행 되었습니까?

여기에 mshtml을 사용하는 레거시 코드를 파헤쳐보고 개발자가 개체를 릴리스 한 방법을 확인할 수 있는지 확인합니다.

편집 :

당신이 그것을 가지고 우리가 여기 이전 코드가 HTMLDocument2 뗍 COM 개체에 가까운 호출합니다.

그러나 주목할 점은 ReleaseComObject 메서드가 0을 반환 할 때까지 루프에서 호출된다는 것입니다. 이렇게하면 모든 com wrapers와 원본 객체가 해제됩니다. here에 대한 메모가 있습니다.

+0

감사! IHTMLDocument2에서 close() 메서드를 볼 수 있으며,이 함수를 호출하여 추가하는 방법을 알 수 있습니다. 누출 자체는 일관성이 있으며 프로그램이 실행되기 시작하면 메모리 사용이 꾸준히 증가합니다. – NoizWaves

+0

나는 이것이 사실이라고 의심 할 것이다. IHTMLDocument2는 COM 개체이므로 .NET 가비지 수집에서 명시 적으로 처리하지 않을 가능성이 큽니다. 루프에서 이전 인스턴스를 정리하지 않고이 인터페이스를 구현하는 객체의 새 인스턴스를 만들면 메모리 누수가 발생합니다. –

+0

@Caelum - close()를 호출하면 누출 속도가 약간 느려지지만 여전히 존재합니다. @Matt - 이것은 내가 생각하고있는 것입니다. 어떻게 이전 인스턴스를 정리해야하는지 알고 있습니까? – NoizWaves