يتم تعريف مؤشر الترابط على أنه مسار تنفيذ البرنامج. يحدد كل خيط تحكمًا فريدًا في التدفق. إذا كان تطبيقك يتضمن عمليات معقدة وتستغرق وقتًا طويلاً، مثل الوصول إلى قاعدة البيانات أو بعض عمليات الإدخال/الإخراج المكثفة، فغالبًا ما يكون من المفيد جدًا إعداد مسارات تنفيذ أو سلاسل عمليات مختلفة، حيث يؤدي كل خيط وظيفة محددة.
المواضيع هي عمليات خفيفة الوزن. أحد الأمثلة الشائعة لاستخدام الخيوط هو تنفيذ البرمجة المتوازية في أنظمة التشغيل الحديثة. يؤدي استخدام سلاسل العمليات إلى تقليل فقدان دورات وحدة المعالجة المركزية وتحسين كفاءة التطبيق.
يعمل البرنامج الذي قمنا بتجميعه حتى الآن كعملية واحدة على مؤشر ترابط، وهو المثيل قيد التشغيل للتطبيق. ومع ذلك، يمكن لمثل هذا التطبيق أداء مهمة واحدة فقط في كل مرة. ولجعلها تؤدي مهام متعددة في نفس الوقت، يمكنك تقسيمها إلى سلاسل رسائل أصغر.
في .Net، تتم معالجة سلاسل الرسائل من خلال مساحة الاسم "System.Threading". يتيح لك إنشاء متغير من النوع system.threading.thread إنشاء موضوع جديد وبدء العمل عليه. يسمح لك بإنشاء مواضيع مستقلة والوصول إليها في موضوع منفصل.
يتم إنشاء الخيط من كائن الخيط، ويُعطى منشئه مرجعًا لبدء الخيط.
ThreadStart Childthreat = new ThreadStart(childthreadcall);
تبدأ دورة حياة الخيط عند إنشاء كائن من فئة system.threading.thread وتنتهي عند إنهاء الخيط أو اكتمال التنفيذ.
فيما يلي الحالات المختلفة في دورة حياة الخيط:
حالة البدء المعلقة: تم إنشاء مثيل مؤشر الترابط ولكن لم يتم استدعاء طريقة بدء التشغيل.
حالة الاستعداد: حالة يكون فيها الخيط جاهزًا للتنفيذ وينتظر دورة وحدة المعالجة المركزية.
حالة غير قابلة للتشغيل: عندما لا يمكن تشغيل مؤشر ترابط، هناك عدة احتمالات:
تسمى طريقة النوم الحالية
يتم استدعاء طريقة الانتظار
تم حظره بواسطة عملية الإدخال/الإخراج
حالة الوفاة: اكتمل تنفيذ مؤشر الترابط أو تم إنهاؤه.
تحدد سمة الأولوية في فئة مؤشر الترابط بشكل أساسي أولوية مؤشر الترابط بالنسبة إلى سلاسل الرسائل الأخرى. يحدد وقت تشغيل .NET مؤشر الترابط الجاهز ذو الأولوية العليا. يمكن تقسيم الأولوية إلى:
أعلى من المعتاد
أقل من المعتاد
الأعلى
أدنى
طبيعي
بمجرد إنشاء مؤشر الترابط، يقوم النظام بتعيين أولويته باستخدام نظام إعداد أولوية فئة الموضوع.
NewThread.Priority = ThreadPriority.Highest;
تحتوي فئة الموضوع على الميزات المهمة التالية:
ملكية | يصف |
---|---|
CurrentContext | احصل على محتويات الموضوع الذي يتم تنفيذه حاليًا. |
الثقافة الحالية | الحصول على أو تعيين بيئة الخيط الحالي. |
المبدأ الحالي | الحصول على أو تعيين سياسة الأمان المستندة إلى الدور للعملية الحالية. |
الموضوع الحالي | احصل على الخيط قيد التشغيل حاليًا. |
CurrentUICulture | الحصول على أو تعيين البيئة الحالية التي يستخدمها مدير موارد العملية الجارية حاليًا للعثور على موارد محددة. |
ExecutionContext | يحصل على كائن ExecutionContext الذي يحتوي على معلومات سياقية حول مؤشر الترابط الحالي. |
حي | يحصل على قيمة تشير إلى حالة تنفيذ مؤشر الترابط الحالي. |
IsBackground | الخلفية - الحصول على قيمة تشير إلى ما إذا كان مؤشر الترابط عبارة عن مؤشر ترابط في الخلفية أو تعيينه. |
IsThreadPoolThread | يحصل على قيمة تشير إلى ما إذا كان مؤشر الترابط ينتمي إلى تجمع مؤشرات الترابط المُدار. |
معرف الموضوع المُدار | يحصل على المعرف الفريد الحالي لسلسلة المحادثات المُدارة. |
اسم | الحصول على أو تعيين اسم الموضوع. |
أولوية | الحصول على أو تعيين قيمة تشير إلى أولوية الجدولة لسلسلة المحادثات. |
حالة الموضوع | يحصل على قيمة تحتوي على حالة مؤشر الترابط الحالي. |
تحتوي فئة الخيط على الطرق المهمة التالية:
طريقة | يصف |
---|---|
إحباط | يؤدي استدعاء ThreadAbortException إلى بدء عملية إنهاء مؤشر الترابط. عادةً ما يؤدي استدعاء هذه الطريقة إلى إنهاء مؤشر الترابط. |
تخصيص فتحة البيانات | يتم تعيين فتحة بيانات غير مسماة لجميع سلاسل الرسائل. للحصول على أداء أفضل، استخدم الحقول المميزة بالسمة ThreadStaticAttribute. |
تخصيصNamedDataSlot | تخصيص فتحات البيانات المسماة لجميع المواضيع. للحصول على أداء أفضل، استخدم الحقول المميزة بالسمة ThreadStaticAttribute. |
بداية المنطقة الحرجة | يخطر المضيف بأن التنفيذ على وشك الدخول إلى منطقة من التعليمات البرمجية حيث قد تؤدي تأثيرات إحباط مؤشر الترابط أو الاستثناء غير المعالج إلى إضعاف المهام الأخرى. |
BeginThreadAffinity | يقوم بإعلام المضيف بأن التعليمات البرمجية المُدارة على وشك التنفيذ، اعتمادًا على هوية مؤشر ترابط نظام التشغيل الفعلي الحالي. |
المنطقة الحرجة | يخطر المضيف بأن التنفيذ على وشك الدخول إلى منطقة التعليمات البرمجية حيث يؤثر إحباط مؤشر الترابط أو الاستثناء غير المعالج على المهمة الحالية فقط. |
EndThreadAffinity | يقوم بإعلام المضيف بأن تنفيذ التعليمات البرمجية المُدارة قد اكتمل، اعتمادًا على هوية مؤشر ترابط نظام التشغيل الفعلي الحالي. |
FreeNamedDataSlot | يزيل الارتباط بين الأسماء والفتحات لجميع سلاسل العمليات في العملية للحصول على أداء أفضل، استخدم الحقول المميزة بالسمة ThreadStaticAttribute. |
GetData | يسترد القيمة من الفتحة المحددة بواسطة مؤشر الترابط الحالي في المجال الحالي لمؤشر الترابط الحالي. للحصول على أداء أفضل، استخدم الحقول المميزة بالسمة ThreadStaticAttribute. |
GetDomain | إرجاع مؤشر الترابط الذي يتم تنفيذه حاليًا في المجال الحالي. |
GetDomainID | إرجاع معرف مجال التطبيق الفريد. |
GetNamedDataSlot | ابحث عن فتحة البيانات المسماة. للحصول على أداء أفضل، استخدم الحقول المميزة بالسمة ThreadStaticAttribute. |
مقاطعة | مقاطعة مؤشر ترابط في حالة مؤشر ترابط WaitSleepJoin. |
ينضم | يحظر مؤشر ترابط الاستدعاء حتى ينتهي أحد مؤشرات الترابط، مع الاستمرار في تنفيذ COM وSendMessage القياسي. تحتوي هذه الطريقة على أشكال مختلفة مثقلة. |
حاجز الذاكرة | عمليات الوصول المتزامنة إلى الذاكرة هي كما يلي: لا يستطيع المسرع الذي يعالج الخيط الحالي إعادة ترتيب التعليمات بطريقة يستدعي الوصول إلى الذاكرة MemoryBarrier متبوعًا بتنفيذ الوصول إلى الذاكرة. |
إعادة تعيينالإجهاض | يلغي طلب إحباط مؤشر الترابط الحالي. |
SetData | يقوم بتعيين البيانات الخاصة بمؤشر الترابط الحالي قيد التشغيل في الفترة الزمنية المحددة والمجال الحالي لمؤشر الترابط هذا. للحصول على أداء أفضل، يحتوي مجال التطبيق على سمة ThreadStaticAttribute الخاصة بالمجال. |
يبدأ | بدء موضوع. |
ينام | يتسبب في توقف الخيط لفترة من الوقت. |
SpinWait | يجعل الخيط ينتظر عدد التكرارات المحددة بواسطة المعلمة. |
القراءة المتطايرة () | قراءة قيمة الحقل. تتم كتابة أحدث قيمة بواسطة أي معالج للكمبيوتر، بغض النظر عن رقم حالة المعالج أو ذاكرة التخزين المؤقت للمعالج. تحتوي هذه الطريقة على أشكال مختلفة مثقلة. |
متقلبة الكتابة () | يكتب على الفور قيمة في حقل مرئي لجميع المعالجات في الكمبيوتر. تحتوي هذه الطريقة على أشكال مختلفة مثقلة. |
أَثْمَر | يؤدي إلى قيام الخيط المستدعي بتنفيذ خيط آخر يمكن تشغيله على المعالج الحالي، ويختار نظام التشغيل إعادة توجيه الخيط |
يوضح المثال التالي استخدام فئات الموضوع. تحتوي الصفحة على ملصق تحكم يعرض الرسائل من المواضيع الفرعية. يتم عرض الرسائل الواردة من البرنامج الرئيسي مباشرة باستخدام طريقة Response.write(50)، بحيث تظهر في أعلى الصفحة.
الملفات المصدر هي كما يلي:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="threaddemo._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional// AR" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title> صفحة بلا عنوان </title> </head> <body> <form id="form1 " runat = "server"> <div> <h3>مثال للموضوع</h3> </div> <asp:Label ID = "lblmessage" runat = "server" Text = "Label"> </asp:Label> < / النموذج> </body> </html>
رمز الخلفية هو كما يلي:
باستخدام النظام؛ باستخدام System.Configuration؛ باستخدام System.Data؛ باستخدام System.Web.Security؛ باستخدام System.Web.UI.HtmlControls باستخدام System.Web.UI.WebControls؛ باستخدام System.Web.UI.WebControls.WebParts؛ باستخدام System.Xml.Linq باستخدام System.Threading؛ class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { ThreadStart Childthreat = new ThreadStart(childthreadcall);Write("بدأ موضوع الطفل <br/>"); Thread(childthreat); Child.Start(); Response.Write("النوم الرئيسي لمدة ثانيتين....<br/>"); Thread.Sleep(2000); Response.Write("<br/>الموضوع الفرعي للإجهاض الرئيسي<br/>"); Child.Abort() } public void Childthreadcall() {try{ lblmessage.Text = "<br/ > بدأ الخيط الفرعي <br/>"; lblmessage.Text += "الخيط الفرعي: Coiunting to 10"; for( int i =0; i<10; i++) { Thread.Sleep(500); lblmessage.Text += "<br/> في الخيط الفرعي </br>"; } lblmessage.Text += "<br/> انتهى الخيط الفرعي" } Catch(ThreadAbortException e){ lblmessage.Text += "<br /> مؤشر ترابط فرعي - استثناء"; "<br /> مؤشر الترابط الفرعي - غير قادر على التقاط الاستثناء"; } } } };
عند تحميل الصفحة، يبدأ موضوع جديد باستخدام Childthreadcall() كمرجع. سيتم عرض أنشطة الموضوع الرئيسي مباشرة على صفحة الويب.
يتم تشغيل مؤشر ترابط آخر وإرسال الرسالة إلى علامة التحكم.
ينام الخيط الرئيسي لمدة 2000 مللي ثانية أثناء تنفيذ الخيط الفرعي.
يستمر مؤشر الترابط الفرعي في العمل حتى يتم إنهاؤه بواسطة مؤشر الترابط الرئيسي، ثم يقوم بطرح ThreadAbortException ويتم إنهاؤه.
يعود التحكم إلى الموضوع الرئيسي.
عند تنفيذ البرنامج سوف يرسل المعلومات التالية: