Domanda

Ciao, sto cercando di utilizzare la libreria Microsoft.mshtml (versione 7.0.3300.0) per estrarre il corpo del testo da una stringa HTML. Ho Sottratto questa funzionalità in un singolo metodo di supporto getBody (stringa).

Quando viene chiamato in un ciclo infinito, il processo si esaurisce la memoria (confermato da eyeballing Utilizzo memoria in Task Manager). Ho il sospetto che il problema è dovuto alla mia pulizia non corretta degli oggetti MSHTML. Che cosa sto facendo di sbagliato?

Il mio attuale definizione di getBody (stringa) è il seguente:

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 perdita di memoria è stata fatta risalire al codice utilizzato in compilazione di un rapporto qualità-html. In questo caso è stato Redenzione Outlook.

È stato utile?

Soluzione

E 'stato molto tempo da quando ho usato mshtml, ma non l'interfaccia IHTMLElement2 avere un metodo vicino? Hai provato a chiamarlo?

Quanto è durata la corsa ciclo prima la perdita era ovvio?

Vedrò se riesco a scavare attraverso alcuni dei codice legacy che ho qui che MSHTML utilizza e vedere come gli sviluppatori rilasciati gli oggetti.

EDIT:

Il vecchio codice che abbiamo qui chiamate vicine sulla quindi rilasciare oggetto COM HTMLDocument2 come lo avete.

Una cosa da notare è però che il metodo ReleaseComObject viene chiamato in un ciclo fino a quando non restituisce zero. Ciò garantirà tutti wrapers com e l'oggetto originale vengono rilasciati, c'è una nota su di esso qui .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top