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.

Foi útil?

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 .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top