سؤال

في النموذج الرئيسي ، اشتركت في حدثين: Application.ThreadException و Application.idle. من الناحية النظرية ، يجب أن يتراجع أي استثناء لم يتم القبض عليه إلى النموذج الرئيسي. ومع ذلك ، هذا لا يعمل إذا حدث الاستثناء في حدث Onidle. النظام مجرد تعطل. لا أحد يعرف كيفية حل هذه المشكلة؟ ًشكراً جزيلا.

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

المحلول

أوافق على أنه ليس من المنطقي للغاية عدم الحصول على حدث ThreadException. ومع ذلك ، فإنه يعمل بهذه الطريقة ، يتم رفع مؤشر الترابط فقط عندما ترسل حلقة الرسالة حدثًا وهناك استثناء غير معالج في معالج الأحداث. يتم رفع الحدث الخمول عندما هناك لا توجد رسالة ليتم إرسالها بعد الآن ، يتبع مسار رمز مختلف تمامًا.

يمكنك العمل حوله عن طريق محاصرة الاستثناءات في معالج الأحداث الخمول بنفسك:

    void Application_Idle(object sender, EventArgs e) {
        try {
            // Do stuff
        }
        catch (Exception ex) {
            Application.OnThreadException(ex);
        }
    }

احذر من أن ThreadException هو مباركة مختلطة إذا سمحت للمستخدم بتقرير ما إذا كان سيتوقف عن البرنامج أو متابعة البرنامج. لاحظ أيضًا أنه ليس عالميًا بما يكفي للقبض الكل استثناءات في البرنامج الخاص بك ، لا تزال بحاجة إلى AppDomain.currentDomain.UnhandledException للتعامل مع الاستثناءات التي أثيرت في مؤشرات ترابط غير مؤشر ترابط واجهة المستخدم أو الاستثناءات التي يتم رفعها قبل بدء تشغيل حلقة الرسالة.

إذا كنت تفعل هذا للتأكد من أن المستخدم يستطيع ليس انقر فوق "متابعة" ثم استخدم Application.SetUnhandleDexceptionMode () لتعطيل حدث ThreadException تمامًا. الآن كل شيء يمر من خلال AppDomain.UnhandledException. إنها الطريقة الأفضل.

نصائح أخرى

استثناءات فقط تفوق كومة الأساليب المسمى.

لا يتم استدعاء حدث الخمول من رمز النموذج الخاص بك ، وبالتالي لن يتراجع عن أي من التعليمات البرمجية الخاصة بك.

بدلاً من ذلك ، سيتعين عليك التقاط استثناءات غير معطلة.

ألق نظرة على:

  1. Application.ThreadException
  2. appdomain.unhandledException

واحد من هؤلاء سوف فخى استثناء الخاص بك.

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