המדריך לתכנות מקבילי בשפת C Sharp – פרק ב' – הבנאי של מחלקת Thread

בפרק הקודם של סדרת מדריכים זו ראינו כיצד ביכולתנו לבצע 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 בנאים בסך הכול.

 C Sharp Multithreading - Thread class Constructors
C Sharp Multithreading – Thread class Constructors

בקטע הקוד שמופיע בתחילת המאמר, קרוב לוודאי ששמתם לב ששלחנו מתודה כפרמטר.
אם זה כך, באיזה מהבנאים שבתמונה לעיל השתמשנו?
על מנת שנוכל לענות על שאלה זו, נעבור על סוגי הבנאים.

ThreadStart

ThreadStart הוא למעשה דלגאט (Delegate), כלומר שהערך שהבנאי מצפה לקבל צריך להיות מצביע לפונקציה.
כלומר שכל Thread חדש שניצור – זקוק לנקודת התחלה לרוץ ממנה.
שימו לב כי חתימת הפונקציה שנשלחה כפרמטר לבנאי חייבת להיות זהה לזו של הדלגאט –
לא מקבלת פרמטרים, ומחזירה void בלבד.
אם נציץ בהגדרה של ThreadStart ( F12 בויז'ואל סטודיו כאשר הסמן על המילה) נוכל לראות את הדלגאט:

 C Sharp Multithreading - ThreadStart Delegate
C Sharp Multithreading – ThreadStart Delegate

כלומר שאם היינו רוצים, היינו יכולים לשלוח גם פונקציה אנונימית (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 ואין לו סוג החזר.

C Sharp Multithreading - ParameterizedThreadStart Delegate
C Sharp Multithreading – ParameterizedThreadStart Delegate

כמו כן, גם במקרה זה הבנאי הנוסף מבקש גודל סטאק מקסימלי כפרמטר נוסף.
שימו לב לדוגמא הבאה שבה נשתמש בבנאי זה:

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 באתר של מייקרוסופט יש ללחוץ כאן.

רוצים לשתף את המדריך?

אהבתכם את המדריך? פתר לכם תקלה?

גולשים יקרים, רוב התכנים המוצגים באתר נכתבים בהתנדבות מלאה מתוך כוונה להנגיש מידע עבורכם. אם נתקלתם במדריך חינמי שפתר לכם תקלה או לימד אתכם משהו חדש שלא ידעתם, וברצונכם לתגמל את כותב המדריך או סתם להזמין אותו לכוס קפה, הינכם יותר ממוזמנים לתרום.

כתיבת תגובה

הזמינו אותי לכוס קפה
buy me coffee

אהבתכם את המדריך? פתר לכם תקלה? הזמינו את כותב המדריך לכוס קפה

גולשים יקרים, רוב התכנים המוצגים באתר נכתבים בהתנדבות מלאה מתוך כוונה להנגיש מידע עבורכם. אם נתקלתם במדריך חינמי שפתר לכם תקלה או לימד אתכם משהו חדש שלא ידעתם, וברצונכם לתגמל את כותב המדריך או סתם להזמין אותו לכוס קפה, הינכם יותר ממוזמנים לתרום.