سؤال

عند إجهاض تنفيذا لموضوع أنا التشكيك دائما بين خروج مشرف مع معالج حدث مثل هذا:

int result = WaitHandle.WaitAny(handles);
if (result = WAIT_FINALIZE)
  FinalizeAndExit();

وواستخدام الحدث للإشارة إلى موضوع يجب إنهاء

وأو مجرد التعامل مع ThreadAbortException لوضع اللمسات الأخيرة على موضوع ...

try
{
  // Main execution
}
catch(ThreadAbortException e)
{
  // FinalizeAndExit();
}
finally
{
}

وأنا عادة أميل إلى استخدام نهج ThreadAbortException لأنه يمكن التعامل معها ولكن يعاد التي أثيرت في نهاية كتلة الصيد، وأنه يتجنب أيضا موضوع من أن أبقى على قيد الحياة عن طريق أساليب "الغادرة"، ولكن أنا 'لقد شهدت كلا النهجين.

ما رأيك؟ هل هناك أي حالة حيث أنه من الأفضل لاستخدام واحد على الآخر، أو هو الأفضل دائما استخدام نهج العاشر؟

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

المحلول

وعموما، الأسلوب الأول هو الافضل.

وانه من الصعب (إن لم يكن مستحيلا) لكتابة التعليمات البرمجية التي سيتم دائما التعامل مع ThreadAbortException بأمان. يمكن أن يحدث الاستثناء في منتصف مهما كان موضوع يحدث أن تفعل، لذلك يمكن لبعض الحالات يكون من الصعب التعامل معها.

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

نصائح أخرى

إذا أستطيع أن أحاول تجنب استخدام Thread.Abort. المشكلة مع Thread.Abort هو أنه يمكن أن يحدث في (تقريبا) أي خط من قانون التنفيذ وقد يسبب بعض السلوك "مثيرة للاهتمام" (اقرأ: البق). Intead أنا أفضل أن يكون نقطة الخروج على قانون بلدي أن يتحقق لحدث أو متغير لمعرفة ما اذا كان الخيط يجب إيقاف تشغيل وبرشاقة الخروج.

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

وعلى الرغم الاستثناءات هي مفيدة وضرورية في بعض الحالات، فإنها يمكن أن لا تحصل ويبالغ.

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