Pregunta

Hola, Estoy tratando de utilizar la biblioteca Microsoft.mshtml (versión 7.0.3300.0) para extraer el texto del cuerpo de una cadena HTML. He abstraje esta funcionalidad en un método de ayuda GetBody única (cadena).

Cuando se llama en un bucle infinito, el proceso finalmente se queda sin memoria (confirmado por echando un vistazo Uso de memoria en el Administrador de tareas). Sospecho que el problema se debe a la limpieza incorrecta de los objetos MSHTML. ¿Qué estoy haciendo mal?

Mi definición actual de GetBody (cadena) es:

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: la pérdida de memoria se ha trazado con el código utilizado en poblar un valor para html. En este caso se trataba de Outlook redención.

¿Fue útil?

Solución

Ha sido un largo tiempo desde que he utilizado mshtml, pero no la interfaz IHTMLElement2 tener un método de cerca? ¿Usted ha intentado llamarlo?

¿Cuánto tiempo duró el bucle de ejecución antes de la fuga era obvio?

Voy a ver si puedo excavar a través de una parte del código legado que tengo aquí que utiliza mshtml y ver cómo los desarrolladores liberan los objetos.

EDIT:

El código antiguo que tenemos aquí por los pelos en la continuación, suelte objeto COM HTMLDocument2 como lo tienes.

Una cosa a destacar es que aunque el método ReleaseComObject se llama en un bucle hasta que se devuelve cero. Esto asegurará que todos los wrapers com y el objeto original se liberan, hay una nota al respecto aquí .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top