בפרק הקודם של סדרת מדריכים זו ראינו כיצד ביכולתנו לבצע Multithreading. בפרק זה נלמד על הבנאי (Constructor) של מחלקת Thread.
תפקידו של הבנאי של מחלקת Thread הוא ליצור את מופע ה-Thread.
כלומר שנצטרך לשלוח לו כפרמטר את הפונקציה שברצוננו שתנוהל דרך אותו ה-Thread.
using System.Threading; namespace Threading1 { internal class Program { static void Main(string[] args) { //Creating Threads Thread thread1 = new(MyMethod1) { Name = "Thread1" }; thread1.Start(); } static void MyMethod1() { for (int i = 1; i <= 5; i++) { Console.WriteLine("MyMethod1 :" + i); } } } }
כפי שניתן לראות, בדוגמא זו שלחנו את הפונקציה MyMethod1 כפרמטר לבנאי של מחלקת Thread.
הבנאים של מחלקת Thread
לבנאי של מחלקת Thread יש 3 העמסות נוספות – 4 בנאים בסך הכול.
בקטע הקוד שמופיע בתחילת המאמר, קרוב לוודאי ששמתם לב ששלחנו מתודה כפרמטר.
אם זה כך, באיזה מהבנאים שבתמונה לעיל השתמשנו?
על מנת שנוכל לענות על שאלה זו, נעבור על סוגי הבנאים.
ThreadStart
ThreadStart הוא למעשה דלגאט (Delegate), כלומר שהערך שהבנאי מצפה לקבל צריך להיות מצביע לפונקציה.
כלומר שכל Thread חדש שניצור – זקוק לנקודת התחלה לרוץ ממנה.
שימו לב כי חתימת הפונקציה שנשלחה כפרמטר לבנאי חייבת להיות זהה לזו של הדלגאט –
לא מקבלת פרמטרים, ומחזירה void בלבד.
אם נציץ בהגדרה של ThreadStart ( F12 בויז'ואל סטודיו כאשר הסמן על המילה) נוכל לראות את הדלגאט:
כלומר שאם היינו רוצים, היינו יכולים לשלוח גם פונקציה אנונימית (Lambda):
Thread thread1 = new( () => MyMethod1() ) { Name = "Thread1" };
או אפילו לכתוב את הפונקציה עצמה במעמד הלמבדה:
Thread thread1 = new(() => { Console.WriteLine($"\n>>>MyMethod1 Started using {Thread.CurrentThread.Name}\n"); Thread.Sleep(3000); for (int i = 1; i <= 5; i++) { Console.WriteLine("MyMethod1 :" + i); } Console.WriteLine($"\n>>>MyMethod1 Endded using {Thread.CurrentThread.Name}\n"); }) { Name = "Thread1" };
ההעמסה הנוספת של בנאי זה אשר מקבלת בנוסף את הפרמטר MaxStackSize, מבצעת את אותה הפעולה,
רק שכאן נוכל להגדיל גודל מקסימלי ל-Stack בבייטים – או 0 על מנת להשתמש בגודל סטאק הדיפולטיבי.
הקומפיילר יתעלם מפרמטר זה במידה והגודל שהגדרנו הוא גדול יותר מהדיפולטיבי.
ParameterizedThreadStart
בבנאי זה נוכל להשתמש על מנת להעביר פונקציה שכן מקבלת פרמטרים.
גם במקרה הזה מדובר בדלגאט – שגם הוא מחזיר void ואין לו סוג החזר.
כמו כן, גם במקרה זה הבנאי הנוסף מבקש גודל סטאק מקסימלי כפרמטר נוסף.
שימו לב לדוגמא הבאה שבה נשתמש בבנאי זה:
using System.Threading; namespace Threading1 { internal class Program { static void Main(string[] args) { Program obj = new(); Thread t1 = new Thread(obj.Thread1, 0); t1.Start(5); } public void Thread1(object num) { int number = Convert.ToInt32(num); for (int i = 1; i <= number; i++) { Console.WriteLine("Method1 :" + i); } } } }
כלומר שעל מנת שנוכל להשתמש בבנאי זה בהצלחה, נקטנו בפעולות הבאות:
- בשורה 9 יצרנו מופע של Program לצורך הגדרת הפונקציה שלנו בדלגאט.
- התחביר הנכון לשליחת הפונקציה לדלגאט לאחר מכן מופיע בשורה 10.
- את הפרמטר העברנו לפונקציה בשורה 11 כאשר התחלנו את פעולת ה-Thread.
שימו לב למשהו חשוב בבנאי זה – הפונקציה שאנו מעבירים לדלגאט צריכה לקבל פרמטר מסוג Object.
כלומר שמדובר בקוד אשר "מועד לפורענות" ועליכם לעשות ולידציות על מנת למנוע תקלות.
בפרק הבא של המדריך נלמד על המתודה –Join והמאפיין – IsAlive.
לקריאה מורחבת על Thread ו-Threading באתר של מייקרוסופט יש ללחוץ כאן.