سؤال

وفقا للوثائق، يجب أن يكون waithandle in .NET بشكل صريح / التخلص منه ضمنيا.ومع ذلك، أواجه مشكلة في تحقيق ذلك مهمة المزامنة الأساسية التالية:

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

هنا محاولتي باستخدام كائن Autoresetevent:

giveacodicetagpre.

هناك حالة سباق واضحة حيث تنتظر الخيط الرئيسي أوقاتا وتخلص كائن مقبض الانتظار الذي يسبب استثناء ObjectDispusesException.هل هناك أي طريقة أخرى قمت بتعيين هذا حتى يتم التخلص من المقبض بشكل صحيح ودون التسبب في الاستثناء؟

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

المحلول

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

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

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

قارن هذا للفصل مع تصميم أقل شجاعة، فئة المهمة لديها طريقة التخلص (). والتي، مثل الخيط، هو تقريبا من الصعب الاتصال. إرشادات من .NET Gurus فقط لا تهتم.

نفس الشيء هنا.

نصائح أخرى

waithandle يتم التخلص منها لأن النطاق باستخدام الخاص بك يستدعي مؤشر ترابط جديد فورا، مما يؤدي إلى التخلص من الخيانات.

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

giveacodicetagpre.

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