أولاً، استخدم الوضع المفرد في وضع التصميم لمنع التهيئة المتعددة للكائنات، مما يتسبب في عدم التناسق في مساحة الوصول.
يجب إضافة قفل عند نقطة العد لمنع عد الخيوط الأخرى مؤقتًا لضمان دقة العد.
إذا كنت تريد العد والإخراج في الوقت الفعلي، فيمكنك قفل العد والإخراج معًا، وإلا فقد لا تتم معالجة نتائج العد والإخراج لخيوط مختلفة بالترتيب.
يمكن أن يضمن القفل بهذه الطريقة معالجة تسلسلية وإخراجًا تسلسليًا، لكن هذا سيفقد بعض الأداء إلى حد ما.
موضع القفل في الكود مهم جدًا
سيضيف هذا البرنامج ثلاث عمليات والسبب هو أن هذا الموضوع لم يصل إلى 200 مرة، ولكن يجب أن يكون هناك موضوع يضاف لأول مرة، لذا قم بالحكم على الإضافة.
انسخ رمز الكود كما يلي:
CommonSigleton MyCounter =CommonSigleton.Instance;
/// <الملخص>
/// عمل الخيط
/// </الملخص>
الفراغ العام DoSomeWork ()
{
/// إنشاء سلسلة العرض
نتائج السلسلة = "";
/// أنشئ مثيل Sigleton
System.Threading.Thread.Sleep(100);
كثافة العمليات ط = 0؛
بينما (MyCounter.GetCounter() <200)
{
// تأكد من أن العدد متسق مع الإخراج. حتى إذا تمت إضافة فاصل زمني بين العد والإخراج، فسيتم قفل هذه المنطقة لمنع سلاسل العمليات الأخرى من العمل.
قفل (هذا)
{
///ابدأ العد
MyCounter.Add();
System.Threading.Thread.Sleep(100);
مؤشر الترابط = Thread.CurrentThread;
النتائج += "الخيط";
results += i++.ToString() + "――〉" + thread.Name + " "؛
results += "العدد الحالي:";
results += MyCounter.GetCounter().ToString();
النتائج += "/ن";
Console.WriteLine(results);
// امسح سلسلة العرض
النتائج = "";
}
}
}
الفراغ العام StartMain ()
{
Thread thread0 = Thread.CurrentThread;
Thread0.Name = "الخيط 0";
Thread thread1 =new Thread(new ThreadStart(DoSomeWork));
thread1.Name = "الخيط 1";
Thread thread2 =new Thread(new ThreadStart(DoSomeWork));
Thread2.Name = "الخيط 2";
Thread thread3 =new Thread(new ThreadStart(DoSomeWork));
Thread3.Name = "الخيط 3";
Thread1.Start();
Thread2.Start();
Thread3.Start();
/// يؤدي الموضوع 0 نفس العمل الذي تؤديه الخيوط الأخرى فقط
DoSomeWork();
}
}