سؤال

استنادا إلى كل ما عندي من القراءة يجب أن يكون هناك واحد GC موضوع استدعاء جميع finalizers.السؤال الآن هو: ما هو نطاق هذه "واحدة" موضوع في العملية أو في مجال التطبيق ، كما كل نية من المجالات هو فصل وجعل "المستقلة" تطبيقات مختلفة في عملية واحدة الفضاء.

قرأت هنا:

إذا حدث استثناء غير معالج يحدث في finalizer CLR المنفذة الموضوع سوف تبتلع استثناء, علاج finalizer كما لو أنها أنجزت عادة ، إزالته من freachable الانتظار والانتقال إلى الإدخال التالي.

أكثر خطورة على الرغم من ما يحدث إذا كان الخاص بك finalizer لا خروج بعض السبب ، على سبيل المثال فإنه كتل ، في انتظار شرط أن لا تحدث. في هذه الحالة finalizer موضوع سوف تكون معلقة لذا لا أكثر finalizable الكائنات سوف تكون القمامة التي تم جمعها. يجب أن يكون كبيرا جدا على بينة من هذا الوضع والتمسك كتابة أبسط كود الخاص بك مجانا الموارد غير المدارة في finalizers.

وهناك اعتبار آخر هو ما يحدث أثناء تطبيق إيقاف التشغيل.عندما برنامج إيقاف تشغيل أداة تجميع مجمعي البيانات المهملة سوف تسعى إلى استدعاء finalizers جميع finalizable الكائنات ، ولكن مع بعض القيود:

  • Finalizable الكائنات لا يتم الترويج إلى أعلى كومة الأجيال خلال إيقاف التشغيل.

  • أي فرد finalizer سوف يكون الحد الأقصى من 2 ثانية لتنفيذ;إذا كان يستغرق وقتا أطول وسوف يكون قتل.

  • هناك حد أقصى 40 ثانية كل finalizers ليتم تنفيذها;إذا كان أي finalizers لا تزال المنفذة ، أو معلقة في هذه النقطة كله العملية فجأة قتل.

الكثير من المشاركات (و حتى الوثائق الرسمية) إساءة استخدام مصطلحي "تطبيق" ، "العملية" و "مجال التطبيق" - معظمهم حتى على افتراض أنهم على قدم المساواة ، لأنه عادة ما يتم تشغيل التطبيقات في تطبيق واحد المجال في عملية واحدة.هذا سوء الاستخدام يجعل كل هذه المستندات من الصعب قراءة ، ولا حتى مفيدة.

لذا سؤالي تتحمل أكثر من التطبيقات, كل شوط في تطبيق منفصل المجال في عملية واحدة.

هل كل هذه الحصة تطبيق نفس GC و finalizer المواضيع ؟ هل المشكلة الموضحة في المقالة أعلاه (تعليق finalizer موضوع) سوف تؤثر على جميع التطبيقات في هذه العملية ؟ إذا كان الجواب نعم هل هناك حلا (إلى جانب عدم استخدام التطبيقات السيئة) و كأنه اكتشاف finalizer الموضوع وإرساله الموضوع.إلغاء المهمة ؟

كل ما سبق هو لأنني ضرب مشكلة مماثلة.بلدي التطبيق يعمل في تطبيق منفصل المجال مثل الدين إلى طرف ثالث البرمجيات (Outlook).لأسباب مختلفة لا تحتاج إلى استدعاء GC.جمع GC.WaitForPendingFinalizers إلى التحرير الكامل COM المراجع (المعتادة interop الروتينية ليست كافية لمكتب/Outlook) ، عندما معين طرف ثالث الدين هو تشغيل ، GC.WaitForPendingFinalizers معلقة إلى الأبد, لذلك أظن أن هناك "سيئة" finalizer في ذلك الطرف الثالث إضافة.ليس لدي أي سيطرة على استبدال/إزالة هذا إضافة (متطلبات العميل) ، لذلك يجب أن أكتشف بنفسي كيفية جعلها تتعايش.

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

المحلول

يبدو أنه هو في الواقع مجرد مؤشر واحد في CLR سبيل المثال في إطار عملية - في هذه اللحظة, على أي حال.هنا بعض التعليمات البرمجية إلى إظهار أن:

الاختبار.cs:

using System;

class Test
{
    static void Main()
    {
        AppDomain.CreateDomain("First")
                 .ExecuteAssembly("ShowFinalizerThread.exe");
        AppDomain.CreateDomain("Second")
                 .ExecuteAssembly("ShowFinalizerThread.exe");
    }
}

ShowFinalizerThread.cs:

using System;
using System.Threading;

class ShowFinalizerThread
{
    static Random rng = new Random();

    ~ShowFinalizerThread()
    {
        Console.WriteLine("Thread/domain: {0}/{1}",
                          Thread.CurrentThread.ManagedThreadId,
                          AppDomain.CurrentDomain.FriendlyName);
        if (rng.Next(10) == 0)
        {
            Console.WriteLine("Hanging!");
            Thread.Sleep(2000);
        }
    }

    static void Main()
    {
        new Thread(LoopForever).Start();
    }

    static void LoopForever()
    {
        while (true)
        {
            new ShowFinalizerThread();
            GC.Collect();
            GC.WaitForPendingFinalizers();
            Thread.Sleep(300);
        };
    }
}

تجميع كل وحدة التطبيق ، ثم تشغيل test.exe (من سطر الأوامر هو أسهل ، المنظمة البحرية الدولية).سترى أن التطبيق واحد المجال finalizer كتل أخرى.

في المستقبل لن يفاجأ أن يرى أحد finalizer الخيط في الأساسية وليس في AppDomain - ولكن يبدو أنك سوف لا تزال لديها مشاكل :(

أقدم لك تعازي الحارة (وإن لم يكن الحل) - مرة واحدة لقد تتبعت طريق مسدود في Oracle النقطة.كنا قادرين على إصلاح ذلك عن طريق التخلص منه بشكل صحيح, ولكن لا أعرف أن كل شيء يعمل بشكل جيد و كان الألم الحقيقي حتى العثور على واحدة!

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