دورة السي شارب
الدرس 12- Multi-Threading
السلام عليكم ورحمة الله وبركاته...
في درسنا اليوم سوف ندرس ال Multi-Threading (( المسارات المتعددة ))
وهي مهمة جدا لأي برنامج يحوي على عمليات خارجية مثل القيام بفحص للفيروسات من قبل
برنامج Anti-Virus أو جلب أسماء ملفات ما وما شابه ذلك...
سوف نستخدم في هذا الدرس المجال
System.Threading.Thread
لذلك قم من الان باستيراده
تبيين فائدة ال Multi-Threading
...
سوف أقوم بمقارنة مباشرة لذلك أولا سوف
نستخدم برنامج لجلب أسماء الملفات بنفس الThread
قم سوف نقوم ببرنامج اخر يقوم بنفس الوظيفة ولكن يستخدم Multi-Threading ...
وسوف يقوم البرنامج بعد جلب أسماء الملفات
بكتابتها في ملف نصي...
البرنامج الأول: ( Single Threading ):
قم بإنشاء مشروع WindowsFormsApplication
جديد وضع به Button
الكود البرنامج بعض وضع الأداة كاملا
(( للإختصار )):
كود:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication20
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
System.Collections.ArrayList myarr = new
System.Collections.ArrayList();
private void button1_Click(object sender, EventArgs e)
{
if (System.IO.Directory.Exists("c:\test") ==
false)
{
System.IO.Directory.CreateDirectory(@"c:\test");
}
foreach (string x in
System.IO.Directory.GetFiles(@"c:\windows\system32"))
{
myarr.Add(x);
}
System.IO.StreamWriter myw = new
System.IO.StreamWriter(@"c:\test\mytest.txt");
foreach (string fx in myarr)
{
myw.WriteLine(fx);
}
myw.Close();
}
}
}
جرب البرنامج بالضغط على الButton ولاحظ...
سوف يتوقف البرنامج عن العمل لمدة حوال 1 ثانية ثم يتم إضافة أسماء الملفات الموجودة
في c:\windows\system32 إلى الملف...
حسنا الان مع حوال 2000 ملف توقف البرنامج
لمدة 1 ثانية ماذا لو كنا نود عمل فحص للكومبيوتر كاملا؟؟؟؟ سوف يتوقف البرنامج عن
العمل لمدة قد تصل إلى 30 دقيقة أو أكثر (( الشيئ متعلق بسرعة الكومبيوتر وكمية الملفات
))
(( ملاحظة إذا لم تلاحظ توقف الكومبيوتر
فأعد التجربة في مكان يحوي على ملفات أكثر ))
--- وهنا ومن أجل ذلك تم إختراع مبدأ ال
multi-threading حيث أصبح
بإمكانك عمل كل تحركاتك دون أي تأثير على أداء البرنامج لنأخذ مثال على نفس البرنامج
مع ال multi-threading
ضع أيضا نقس الأدوات السابقة (Listbox,Button) واكتب الكود التالي:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication20
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
System.Collections.ArrayList myarr = new
System.Collections.ArrayList();
private void button1_Click(object sender, EventArgs e)
{
System.Threading.Thread mythread = new
System.Threading.Thread(dowork);
mythread.Priority = System.Threading.ThreadPriority.Lowest;
mythread.Start();
}
private void dowork()
{
if (System.IO.Directory.Exists("c:\test") ==
false)
{
System.IO.Directory.CreateDirectory(@"c:\test");
}
foreach (string x in
System.IO.Directory.GetFiles(@"c:\windows\system32"))
{
myarr.Add(x);
}
System.IO.StreamWriter myw = new
System.IO.StreamWriter(@"c:\test\mytest.txt");
foreach (string fx in myarr)
{
myw.WriteLine(fx);
}
myw.Close();
MessageBox.Show("Progress Completed!");
}
}
}
سوف تلاحظ عمل نفس الشيئ ولكن دون أي توقف
أو بطئ للبرنامج مهما كان عدد الملفات...
أهم ما في الفئة Thread
...
1- Start
وهي لبدأ ال Thread
2-Suspend
لإيقاف الThread
مؤقتا...
3- Abort
لإيقاف ال Thread
تهائيا...
4- Resume
لإكمال ال Thread
5- IsBackGround
... جاء وقت شرحها...
إن ال BackGround
Thread تتشابه بحد كبير مع ال Thread العادي
ولكن الفرق يكمن بينهما في ما يلي...
أولا ضع Button
وكتب في الحدث Click
الخاص به:
System.Threading.Thread.CurrentThread.Abort();
سوف تلاحظ أن البرنامج توقف عن العمل ولكن
لماذا؟؟؟؟
السبب:
لم يعد هناك أي Fore
Thread حي ولذلك تم إغلاق البرنامج ...
نتيجة... :إذا لم هناك أي Fore Thread قيد الإستخدام
يغلق البرنامج...
أما لو كان ال Thread
الذي يعمل مع برنامجك بشكل إفتراضي مع BackGround Thread فلن تراه
في عمرك ...
فحتى لو كان هناك BackGround Thread حي و لا
يوجد أي Fore Thread فسوف يغلق البرنامج دون أن يهتم بالباقي....
أما العكس فليس صحيح..
أرجو أن تكون قد إستفدت من هذا الدرس ولكن
حديثنا عن ال Threads لم ينتهي بل سوف يكون هناك له بقية إن شاء الله للتجنب بالوقوع في أخطار
هذه ال Thread لأن لها أخطار كبيرة على برنامجك......
مع تحياتي:abdalkader Al-badani
إلى اللقاء في الدرس القادم إن شاء الله...
ليست هناك تعليقات:
إرسال تعليق