System.Threading.Thread
الفئة الاساسية في مجال الاسماء هذا ، تتيح لنا انشاء threads وتنفيذ مهامنا المختلفة عليها ، مكونات هذه الفئة الاساسية هي :
Sleep() : توقف عمل ال thread لفترة من الوقت .
IsAlive : قيمة توضح إذا كان ال thread ما زال يعمل ام لا .
IsBackground : إذا كان ال thread يعمل في background .
Priority : الأولوية الحالية .
ThreadState : حالة ال Thread .
Name : اسم ال thread .
Abort() : خروج .
Join() : توقف عمل ال thread حتى حدوث الحدث في join .
Resume() : استئناف العمل بعد ايقافه .
Start() : بدء العمل للمرة الأولى .
Suspend() : ايقاف العمل مؤقتاً .
سنقوم بداية بعمل تجربة سريعة للاستدلال على معنى ان يتم تنفيذ مهمتين في نفس الوقت ، نعود بعدها لاستئناف شرح المفاهيم الخاصة بالموضوع .
قم بتجربة الكود التالي :
c#:
كود :
[FONT=Tahoma]static void Main(string[] args)
{[/FONT]
[FONT=Tahoma]order1();
order2();
[/FONT]
[FONT=Tahoma]Console.ReadKey();
}[/FONT]
[FONT=Tahoma]static void order1()
{
for (int i = 0; i < 100; i++)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.Write(i.ToString() + " ");
}
}[/FONT]
[FONT=Tahoma]static void order2()
{
for (int i = 100; i > 0; i--)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.Write(i.ToString() + " ");
}
}[/FONT]
vb.net:
كود :
[FONT=Tahoma]Private Shared Sub Main(ByVal args As String())
order1()
order2()
Console.ReadKey()
End Sub
Private Shared Sub order1() [/FONT]
[FONT=Tahoma]For i As Integer = 0 To 99
Console.ForegroundColor = ConsoleColor.Green
Console.Write(i.ToString() + " ")
Next
End Sub
Private Shared Sub order2() [/FONT]
[FONT=Tahoma]For i As Integer = 100 To 1 Step -1
Console.ForegroundColor = ConsoleColor.Red
Console.Write(i.ToString() + " ")
Next
End Sub [/FONT]
الكود كما هو واضح يقوم بطباعة الأرقام تصاعدياً وتنازلياً ، الناتج الطبيعي هو طباعة التصاعدي ومن ثم التنازلي ، في حين يتم طباعة نتائج الدالة الأولى بالأخضر والثانية بالأحمر للتفريق لتكون شاشة النتائج بالشكل التالي مثلاً :
وهذا الطبيعي ، يتم تنفيذ الدالة الأولى حتى الانتهاء ومن ثم الثانية حتى الانتهاء ، أما الآن سنقوم بتعريف threads مختلفة للتنفيذ بحيث يتم تنفيذ كل دالة على واحد منها حيث سيتم تنفيذهم على البروسيسور في نفس الوقت ، الكود التالي مثلاً :
c#:
كود :
[FONT=Tahoma]static void Main(string[] args)
{
System.Threading.Thread t1 = new System.Threading.Thread(order1);
t1.Start();[/FONT]
[FONT=Tahoma]System.Threading.Thread t2 = new System.Threading.Thread(order2);
t2.Start();[/FONT]
[FONT=Tahoma]Console.ReadKey();
}[/FONT]
[FONT=Tahoma]static void order1()
{
for (int i = 0; i < 100; i++)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.Write(i.ToString() + " ");
}
}[/FONT]
[FONT=Tahoma]static void order2()
{
for (int i = 100; i > 0; i--)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.Write(i.ToString() + " ");
}
}[/FONT]
vb.net:
كود :
[FONT=Tahoma]Private Shared Sub Main(ByVal args As String())
Dim t1 As New System.Threading.Thread(order1)
t1.Start()
Dim t2 As New System.Threading.Thread(order2)
t2.Start()
Console.ReadKey()
End Sub
Private Shared Sub order1() [/FONT]
[FONT=Tahoma]For i As Integer = 0 To 99
Console.ForegroundColor = ConsoleColor.Green
Console.Write(i.ToString() + " ")
Next
End Sub
Private Shared Sub order2() [/FONT]
[FONT=Tahoma]For i As Integer = 100 To 1 Step -1
Console.ForegroundColor = ConsoleColor.Red
Console.Write(i.ToString() + " ")
Next
End Sub [/FONT]
الآن لنرى طبيعة النتائج .
بالطبع النتائج لن تكون كما هي كل مرة ، جرب تغيير ال Priority مثلاً لواحد منهم وجرب النتائج ، ستجد أن صاحب الأولوية الأعلى يتم الانتهاء منه قبل الثاني ، الكود التالي مثلاً :
كود :
[FONT=Tahoma]t1.Priority = System.Threading.ThreadPriority.Highest;[/FONT]
ستصبح النتائج بالشكل التالي :
ستجد اختلافات في التنفيذ ، لكن الشاهد هو أن الكودين تم تنفيذهم سوية في هذا الوقت .
بالطبع ليس هذا هو استخدام الوحيد لل threads ، ولكنها كانت فقط مقدمة سريعة . سنعود ونواصل .