質問

ねえ、私は、HTML文字列から本文を抽出するためにMicrosoft.MSHTML(バージョン7.0.3300.0)ライブラリを使用しようとしています。私は、単一のヘルパーメソッドGetBody(文字列)には、この機能を抽象化してきています。

無限ループ内で呼び出されるとき

、プロセスは最終的には(タスクマネージャのメモリ使用量をeyeballingによって確認)メモリ不足します。私はこの問題は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の償還だっます。

役に立ちましたか?

解決

私はMSHTMLを使用しているので、長い時間でしたが、IHTMLElement2インタフェースは、closeメソッドを持っていませんか?あなたはそれを呼び出してみました?

漏れが明らかだった前に、ループの実行をした

どのくらい?

私はMSHTMLを使用して、私はここにあるレガシーコードのいくつかを掘ると、開発者がオブジェクトを解放方法を見ることができれば、私は表示されます。

EDITます:

あなたはそれを持っているように、

私たちはここにある古いコードは近いHTMLDocument2放しCOMオブジェクトを呼び出します。

しかしもう一つ注意すべきは、それがゼロに戻るまでからReleaseComObjectメソッドがループ内で呼び出されていることです。これは、それについてのノート<のhref = "http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.releasecomobjectがあり、すべてのCOM wrapersと、元のオブジェクトが解放されていることを確認します。ここをASPX」のrel = "nofollowをnoreferrer">。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top