سؤال

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

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

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

المحلول

هممم, لقد استعملت مختلف السيناريوهات التي تعتمد على ما كنت بحاجة في ذلك الوقت.

وأعتقد أن BeginInvoke ربما تكون أسهل رمز منذ كنت هناك تقريبا.وفي كلتا الحالتين يجب أن يكون باستخدام الاحتجاج بالفعل, حتى مجرد تغيير BeginInvoke.باستخدام رد على موضوع مستقل سوف تفعل نفس الشيء (طالما كنت تستخدم threadpool أن يصطف رد) باستخدام BeginInvoke.

نصائح أخرى

منذ كنت تستخدم نموذج أسهل طريقة هي استخدام BackgroundWorker المكون.

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

لديك عدد قليل من الخيارات ، كما سبق مفصلا ، ولكن في تجربتي, كنت أفضل حالا ترك مندوب BeginInvoke باستخدام BackgroundWorker بدلا من ذلك (v2.0+) ، كما أنه أسهل في الاستخدام و أيضا يسمح لك بالتفاعل مع النموذج الرئيسي على الموضوع الإنجاز.جميع في كل شيء جدا weel تنفيذ الحل ، وجدت.

النظام.ComponentModel.BackgroundWorker هو في الواقع نقطة انطلاق جيدة.انها لن تفعل الخاص بك غير متزامن العمل ، تعطيك إشعارات من الأحداث الهامة ، طرق تحسين التكامل مع النماذج الخاصة بك.

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

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