Question

Hé, je tente d'utiliser la bibliothèque Microsoft.mshtml (version 7.0.3300.0) pour extraire le corps du texte à partir d'une chaîne HTML. J'ai Abstraite cette fonctionnalité en une seule méthode d'aide GetBody (string).

Quand elle est appelée dans une boucle infinie, le processus se déroule finalement de mémoire (confirmée par eyeballing Mem Utilisation dans le Gestionnaire des tâches). Je soupçonne que le problème est dû à mon nettoyage incorrect des objets MSHTML. Qu'est-ce que je fais mal?

Ma définition actuelle de GetBody (string) est:

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 fuite de mémoire a été tracée à l'aide du code utilisé dans le remplissage d'une valeur de html. Dans ce cas, il a été rachat Outlook.

Était-ce utile?

La solution

Il a été longtemps que je l'ai utilisé mshtml, mais ne pas l'interface IHTMLElement2 une méthode proche? Avez-vous essayé l'appeler?

Combien de temps la course en boucle avant que la fuite était évidente?

Je vais voir si je peux creuser à travers une partie du code de l'héritage que j'ai ici qui utilise mshtml et voir comment les développeurs ont publié les objets.

EDIT:

Le vieux code que nous avons ici appelle près de la HTMLDocument2 puis relâchez l'objet com comme vous l'avez.

Une chose à noter cependant est que la méthode ReleaseComObject est appelée dans une boucle jusqu'à ce qu'il revienne à zéro. Cela permettra d'assurer tous les com wrapers et l'objet d'origine sont libérés, il y a une note à ce sujet ici .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top