Usando Microsoft.mshtml em um loop, vazamento de memória
-
19-09-2019 - |
Pergunta
Ei, eu estou tentando usar a biblioteca Microsoft.mshtml (versão 7.0.3300.0) para extrair o corpo do texto de uma seqüência de HTML. Eu abstraída essa funcionalidade em um GetBody único método auxiliar (string).
Quando chamado em um loop infinito, o processo, eventualmente, ficar sem memória (confirmado por eyeballing Uso de memória no Gerenciador de tarefas). Eu suspeito que o problema é devido a minha limpeza incorreta do MSHTML objetos. O que estou fazendo de errado?
O meu actual definição de 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;
}
Edit: o vazamento de memória foi rastreada para o código usado no preenchimento de um valor para html. Neste caso, foi Redemption Outlook.
Solução
Tem sido um longo tempo desde que eu usei mshtml, mas não o IHTMLElement2 interface tem um método perto? Já tentei ligar para ele?
Quanto tempo durou o ciclo de execução antes do vazamento era óbvio?
Vou ver se eu posso cavar através de algum código legado que tenho aqui que usos Mshtml e ver como os desenvolvedores divulgou os objetos.
EDIT:
O código antigo que temos aqui chama perto do HTMLDocument2 solte com objeto como você tê-lo.
Uma coisa a notar é que embora o método ReleaseComObject é chamado em um loop até que ele retorne zero. Isso irá garantir que todos os wrapers COM e o objeto original são liberados, há uma nota sobre o assunto aqui .