Frage

Hallo, ich bin versucht, die Microsoft.mshtml (Version 7.0.3300.0) Bibliothek zu verwenden, um den Körper von Text aus einer HTML-Zeichenfolge zu extrahieren. Ich habe diese Funktionalität in einem einzigen Hilfsmethode GetBody abstrahiert (string).

Wenn in einer Endlos-Schleife genannt wird, läuft der Prozess schließlich aus Speicher (bestätigt durch Speichernutzung in Task-Manager Anglotzen). Ich vermute, dass das Problem auf meine falsche Bereinigung der MSHTML Objekte zurückzuführen ist. Was mache ich falsch?

Meine aktuelle Definition von GetBody (string) ist:

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;
}

Edit: der Speicherverlust auf den Code zurückverfolgt wurde in bevölkern einen Wert für HTML verwendet. In diesem Fall war es Outlook Redemption.

War es hilfreich?

Lösung

Es ist lange her, seit ich mshtml verwendet habe, aber die IHTMLElement2 Schnittstelle verfügt nicht über eine enge Methode? Haben Sie versucht, es nennen?

Wie lange hat die Schleife laufen, bevor das Leck offensichtlich war?

Ich werde sehen, ob ich durch einige der Legacy-Code graben kann ich hier habe, die mshtml verwendet und sehen, wie die Entwickler die Objekte freigegeben.

EDIT:

Der alte Code, den wir hier ruft der Nähe auf der HTMLDocument2 dann los com Objekt haben, wie Sie es haben.

Eine Sache, obwohl zu beachten ist, dass die ReleaseComObject Methode in einer Schleife aufgerufen wird, bis er Null zurückkehrt. Dies wird alle com wrapers und das ursprüngliche Objekt gewährleisten freigegeben werden, gibt es eine Notiz darüber hier .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top