سؤال

مهلا، أحاول استخدام مكتبة Microsoft.MSHTML (الإصدار 7.0.3300.0) لاستخراج نص الجسم من سلسلة HTML. لقد أجريت هذه الوظيفة في طريقة مساعدة واحدة (سلسلة).

عند الاتصال به في حلقة لانهائية، تنفد العملية في نهاية المطاف من الذاكرة (أكدت استخدام MEME MEM في إدارة المهام). أظن أن المشكلة ترجع إلى نظفتي غير الصحيحة لكائنات MSHTML. ما الخطأ الذي افعله؟

التعريف الحالي للحصول على GETRIDBOD (سلسلة) هو:

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;
}

تحرير: تم تتبع تسرب الذاكرة إلى الرمز المستخدم في ملء قيمة HTML. في هذه الحالة، كان redemption Outlook.

هل كانت مفيدة؟

المحلول

لقد مضى وقت طويل منذ أن استخدمت mshtml، لكن لا تحتوي واجهة IHTMLELELEMENT2 على طريقة إغلاق؟ هل حاولت الاتصال به؟

كم من الوقت تم تشغيل الحلقة قبل التسرب واضحة؟

سأرى إذا كان بإمكاني حفر من خلال بعض الرمز القديم الذي لدي هنا يستخدم MSHTML وشاهد كيف أصدر المطورون الكائنات.

تعديل:

الكود القديم لدينا مكالمات هنا قريبة من HTMLDOCument 2 ثم قم بإصدار كائن COM كما لديك.

شيء واحد يجب ملاحظة أنه هو أن طريقة ReleasecomObject تسمى في حلقة حتى ترجع الصفر. سيضمن ذلك جميع ملفات COM ويتم إصدار الكائن الأصلي، هناك ملاحظة حول هذا الموضوع هنا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top