ما هي أفضل طريقة لجعل مؤشر الترابط يشير إلى مؤشر ترابط آخر في .NET؟

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

  •  02-07-2019
  •  | 
  •  

سؤال

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

في هذا الموضوع يقترح الناس الهياكل المناسبة لذلك في C++، لكنني لا أعرف شيئًا مشابهًا في .NET.هل يمكن لشخص ما أن يلقي بعض الضوء؟

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

المحلول

جرِّب أو حاول تطبيقBackgroundWorker.وهو يدعم تحديثات التقدم وإلغاء مهمة قيد التشغيل.

إذا كنت تريد أن ينتظر أحد الخيوط حتى ينتهي مؤشر ترابط آخر من القيام بعمله، فإن Monitor.Wait وMonitor.Pulse جيدان، كما هو الحال مع ManualResetEvent.ومع ذلك، هذه ليست في الحقيقة أي فائدة لإلغاء مهمة قيد التشغيل.

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

private volatile bool cancelling;

اطلب من الخيط الرئيسي ضبطه على "صحيح"، واطلب من الخيط العامل التحقق منه بشكل دوري وتعيينه على "خطأ" عند الانتهاء.

هذا لا يمكن مقارنته حقًا بوجود "متغير عام"، حيث لا يزال بإمكانك تحديد نطاق متغير الإشارة ليكون خاصًا بفئة ما.

نصائح أخرى

غامضة بعض الشيء (قصيرة الوقت)، ولكن النظر فيها ManualResetEvent وAutoResetEvent.قد ترغب أيضًا في البحث عن الكلمة الرئيسية للمراقبة والقفل.

ابحث في Monitor.Wait وMonitor.Pulse.فيما يلي مقالة ممتازة عن Threading in .Net (سهلة القراءة): http://www.albahari.com/threading/part4.aspx

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

يعتمد ذلك على نوع المزامنة التي تحتاجها.إذا كنت تريد أن تكون قادرًا على تشغيل مؤشر الترابط في حلقة حتى يتم الوصول إلى نوع ما من نهاية التنفيذ - فكل ما تحتاجه هو متغير منطقي ثابت.إذا كنت تريد أن ينتظر مؤشر ترابط واحد حتى يصل مؤشر ترابط آخر إلى نقطة التنفيذ، فقد ترغب في استخدام WaitEvents (AutoResetEvent أو ManualResetEvent).إذا كنت بحاجة إلى الانتظار لمقابض الانتظار المتعددة، فيمكنك استخدام WaitHandle.WaitAll أو WaitHandle.WaitAny.

انظر إلى مساحة الاسم System.Runtime.Remoting.

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