تعدد في C # مع المهام

click fraud protection

ال برمجة الحاسوب مصطلح "خيط" هو اختصار لخيط التنفيذ ، حيث يتبع المعالج مسارًا محددًا من خلال التعليمات البرمجية الخاصة بك. يقدم مفهوم متابعة أكثر من موضوع واحد في كل مرة موضوع تعدد المهام وتعدد الخيوط.

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

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

تعدد المهام مع المواضيع

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

instagram viewer

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

إنشاء خيط

في نظام مساحة الاسم. خيوطستجد نوع الخيط. خيط المنشئ (ThreadStart) يقوم بإنشاء مثيل لمؤشر ترابط. ومع ذلك ، في الآونة الأخيرة ج # رمز ، فمن المرجح أن يمر في تعبير لامدا الذي يستدعي الأسلوب مع أي معلمات.

إذا كنت غير متأكد من ذلك تعبيرات لامدا، قد يكون من المفيد التحقق من LINQ.

فيما يلي مثال لمؤشر ترابط يتم إنشاؤه وتشغيله:

باستخدام النظام ؛
باستخدام النظام. خيوط
مساحة الاسم ex1
{
برنامج الطبقة
{
Write1 () الفراغ الثابت العام
{
وحدة التحكم. اكتب ('1') ؛
مسلك. النوم (500) ؛
}
الفراغ الثابت الرئيسي (سلسلة [] قوس)
{
var task = موضوع جديد (Write1) ؛
مهمة. بداية() ؛
for (var i = 0؛ ط <10 ؛ ط ++)
{
وحدة التحكم. اكتب ('0') ؛
وحدة التحكم. اكتب (المهمة. حي؟ 'ميلادي') ؛
مسلك. النوم (150) ؛
}
وحدة التحكم. مفتاح قراءة() ؛
}
}
}

كل هذا المثال هو كتابة "1" إلى وحدة التحكم. يكتب مؤشر الترابط الرئيسي "0" إلى وحدة التحكم 10 مرات ، في كل مرة متبوعة بحرف "A" أو "D" اعتمادًا على ما إذا كان مؤشر الترابط الآخر لا يزال على قيد الحياة أو ميتًا.

يتم تشغيل مؤشر الترابط الآخر مرة واحدة فقط ويكتب "1." بعد مهلة نصف ثانية في مؤشر الترابط Write1 () ، ينتهي مؤشر الترابط والمهمة. إرجاع IsAlive في الحلقة الرئيسية الآن "D."

تجمع مؤشرات الترابط والمكتبة الموازية للمهمة

بدلاً من إنشاء سلسلة المحادثات الخاصة بك ، ما لم تكن بحاجة فعلاً لذلك ، استخدم تجمع سلسلة الرسائل. من .NET 4.0 ، يمكننا الوصول إلى مكتبة المهام المتوازية (TPL). كما في المثال السابق ، نحتاج مرة أخرى إلى القليل من LINQ ، ونعم ، كلها تعبيرات لامدا.

تستخدم المهام تجمع موضوع وراء الكواليس ولكن الاستفادة بشكل أفضل من الخيوط اعتمادًا على العدد المستخدم.

الكائن الرئيسي في TPL هو مهمة. هذه فئة تمثل عملية غير متزامنة. الطريقة الأكثر شيوعًا لبدء تشغيل الأشياء هي المهمة. مصنع. بدء جديد كما في:

مهمة. مصنع. StartNew (() => DoSomething ()) ،

حيث DoSomething () هي الطريقة التي يتم تشغيلها. من الممكن إنشاء مهمة وعدم تشغيلها على الفور. في هذه الحالة ، استخدم المهمة مثل هذا:

var t = مهمة جديدة (() => وحدة التحكم. WriteLine ("مرحبًا")) ؛
...
ر. بداية()؛

لا يبدأ هذا مؤشر الترابط حتى يتم استدعاء .Start (). في المثال أدناه ، هناك خمس مهام.

باستخدام النظام ؛
باستخدام النظام. خيوط
باستخدام النظام. خيوط. مهام؛
مساحة الاسم ex1
{
برنامج الطبقة
{
الفراغ الثابت العام Write1 (int i)
{
وحدة التحكم. كتبت انا) ؛
مسلك. النوم (50) ؛
}
الفراغ الثابت الرئيسي (سلسلة [] قوس)
{
for (var i = 0؛ ط <5 ؛ ط ++)
{
var value = i؛
var runningTask = المهمة. مصنع. StartNew (() => Write1 (value)) ؛
}
وحدة التحكم. مفتاح قراءة() ؛
}
}
}

قم بتشغيل ذلك وستحصل على الأرقام من 0 إلى 4 في ترتيب عشوائي مثل 03214. ذلك لأن أمر تنفيذ المهمة يحدده .NET.

قد تتساءل عن سبب الحاجة إلى var var = i. حاول إزالته والاتصال بكتابة (i) ، وسترى شيئًا غير متوقع مثل 55555. لماذا هذا؟ ذلك لأن المهمة تُظهر قيمة i في وقت تنفيذ المهمة ، وليس عند إنشاء المهمة. عن طريق إنشاء جديد متغير في كل مرة في الحلقة ، يتم تخزين كل من القيم الخمس والتقاطها بشكل صحيح.

instagram story viewer