سؤال

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

والمشاكل لدي هي: 1. يجب أن يتم إنشاء الكائن على موضوع UI 2. الكائن هو جسم غريب، وليس لدي أي وصول المصدر، لذلك لا يمكن تعديله.

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

وتيا مارتن

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

المحلول

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

وهناك طريقة "أكثر أمانا" هو أن يكون Interrupt دعوة عامل - وهذا سوف يثير ThreadInterruptedException في موضوع UI، ولكن فقط عندما يكون في حالة WaitSleepJoin - إذا كان موضوع لا تنام أنه لن يقاطع، إلا أنها على الأقل لن يتعطل أو الذاكرة الفاسدة سواء.

نصائح أخرى

وليس حقا. خاصة إذا لم يكن لديك الوصول إلى المصدر.

وحتى إذا كنت تستطيع، أنها ليست فكرة جيدة أن يقطع كود قسرا دون سبب وجيه - أنها يمكن أن تؤدي إلا إلى المشاكل (التسريبات، أقفال يجري يقم مقفل، الخ)

هل يجب أن يكون عليه <م> نفس موضوع UI؟ هل يمكن أن تفرخ موضوع UI الثاني لامتلاك هذا الرمز؟ فإنه يحصل على قليلا مترابط، ولكن يمكن أن تعمل.

وإذا كنت تستخدم BeginInvoke، و IAsyncResult لديها مقبض الانتظار التي يمكنك WaitOne (مهلة) - من موضوع عدم UI

ولسوء الحظ، في مهلة، لا توجد وسيلة نظيفة لإلغاء هذا BeginInvoke - لذلك قد محاولة حل 1800 INFORMATION ل

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