ループ内Microsoft.MSHTMLを使用して、メモリリーク
-
19-09-2019 - |
質問
ねえ、私は、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">。