هل لا يزال ThreadAbortException يفرض تنفيذ التعليمات البرمجية في قسم (المحاولة/الالتقاط) أخيرًا؟

StackOverflow https://stackoverflow.com/questions/6099382

سؤال

انا املك System.Timers.Timer الموقت الذي هو عليه AutoReset تم ضبطه على false.أنا استخدم أ try/finally لتأمين أنا Start الموقت في نهاية الأمر callback (أستخدم المؤقت بهذه الطريقة لمنع تداخل callback تنفيذ).شفرة:

// inside timer call back
try
{
    // Do something
}
finally
{
    timer.Start(); // Is this line always executed?
}

سؤالي هو ماذا يحدث إذا كان مؤشر الترابط المنفذ Aborted؟هل finally هل ما زال القسم قيد التنفيذ أم أنه لا يوجد مؤشر ترابط لتشغيل هذا الجزء؟

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

المحلول

نعم، سيتم دائمًا تنفيذ هذا السطر وحظر الإجهاض حتى يتم إدخال الرمز الموجود في ملف finally تنتهي الجملة.

نصائح أخرى

المصدر الرسمي...

عندما يتم إجراء مكالمة إلى طريقة الإجهاض لتدمير سلسلة رسائل ، يلقي وقت تشغيل اللغة الشائعة بمثابة ترابط.ThreadAbortException هو استثناء خاص يمكن اكتشافه ، ولكن سيتم رفعه تلقائيًا مرة أخرى في نهاية كتلة الصيد.عند رفع هذا الاستثناء ، ينفذ وقت التشغيل جميع الكتل أخيرًا قبل إنهاء الخيط.نظرًا لأن الخيط يمكن أن يقوم بحساب غير محدود في الكتل أخيرًا أو الاتصال.إذا كنت ترغب في الانتظار حتى ينتهي الخيط الذي تم إحباطه ، فيمكنك استدعاء Thread.Soin Method.الانضمام هي مكالمة حظر لا تعود حتى يتوقف الخيط فعليًا عن التنفيذ.

اقرأ المزيد عنها على MSDN.

كوث ال توثيق (التأكيد لي):

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

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

لذا فإن الجواب هو نعم، سيتم تنفيذ الكتل أخيرًا.

نعم finally سيتم استخدامه دائمًا بغض النظر عن كيفية الخروج منه try,

 Whereas catch is used to handle exceptions that occur in a statement block, 
 finally is used to guarantee a statement block of code executes regardless 
 of how the preceding try block is exited.

اقرأ المزيد عليه MSDN.

إذا تم إحباط الخيط بالفعل، فيمكن الاستمرار في تنفيذ كتلة الالتقاط والكتلة الأخيرة.

يرجى الرجوع إلى هذا الرابط للحصول على صورة واضحة حول كيفية التعامل معه في فئة system.threadingالسباكة في أعماق ThreadAbortException

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