כיצד לעבוד עם אשכולות ב- C #

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

חוטי תכנות ב- C #

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

 חוט t = חוט חדש (ThreadStart חדש (MyThreadMethod)); 

כדי להפעיל את השרשור החדש שנוצר, עליך להתקשר לשיטת התחלה באובייקט השרשור שיצרת. רישום הקוד הבא ממחיש זאת. שים לב ששיטת השרשור MyThreadMethod מבצעת בשרשור החדש (הנקרא שרשור עובד) שנוצר.

 ריק סטטי ראשי ()

        {

            חוט t = חוט חדש (ThreadStart חדש (MyThreadMethod));

            t.Start ();           

            Console.Read ();

        }

        חלל סטטי MyThreadMethod ()

        {

            Console.WriteLine ("שלום עולם!");

        }

הצגת מצבי חוט ב- C #

חוט בזיכרון יכול להיות במצבים שונים - בוטל, רקע, פועל, נעצר, מושעה, לא מופעל וכו '. מצבי חוט מוגדרים בספירת ThreadState הזמינה במרחב השמות System.Threading. אלא אם כן מתבצעת קריאה לשיטת Start בשרשור, השרשור נמצא במצב Unstarted. כאשר מופעלת שיטת התחלה במופע השרשור, מצב השרשור משנה מ- Unstarted ל- Running.

קטע הקוד הבא מראה כיצד ניתן להציג את מצב השרשור במסוף.

 חוט t = חוט חדש (ThreadStart חדש (MyThreadMethod));

t.Start ();

Console.WriteLine ("מצב השרשור הוא:" + t.ThreadState.ToString ());

שלוט על חוטי חזית ורקע ב- C #

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

ניתן להגדיר את סטטוס הרקע של שרשור באמצעות המאפיין IsBackground. הנה דוגמה לקוד שמראה כיצד ניתן להשיג זאת.

 ריק סטטי ראשי ()

        {

            חוט t = חוט חדש (ThreadStart חדש (MyThreadMethod));

            t.Start ();

            t.IsBackground = נכון;

            Console.WriteLine ("סטטוס הרקע של השרשור הוא:" + t.IsBackground.ToString ());

            Console.Read ();

        }

באפשרותך להשעות או לחדש שרשור על ידי הפעלת השיטות Suspend () ו- Resume () על אובייקט השרשור. שים לב שאתה יכול לחדש רק שרשור שהשעית בעבר על ידי שיחה לשיטת השעיה ().

 חוט t = חוט חדש (ThreadStart חדש (MyThreadMethod));

t.Start ();

השהה (); // משעה את השרשור שנוצר לאחרונה

t.Resume (); // ממשיך את החוט התלוי

עם זאת, יש לציין כי השיטות Thread.Suspend () ו- Thread.Resume () הוצאו משימוש. במקום זאת עליך להשתמש בשיטות AutoResetEvent ו- EventWaitHandle כדי לסנכרן פעילויות הקשורות לשרשור.

הגדר עדיפות שרשור ב- C #

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

 ריק סטטי ראשי ()

        {

            חוט משנה 1 = שרשור חדש (ThreadStart חדש (שיטה 1));

            שרשור הברגה 2 = שרשור חדש (ThreadStart חדש (שיטה 2));

            thread1.Priority = ThreadPriority.Highest;

            thread2.Priority = ThreadPriority.Lowest;

            thread2.Start ();

            thread1.Start ();

            Console.Read ();

        }

        בטל סטטי שיטה 1 ()

        {

            עבור (int i = 0; i <10; i ++)

            {

                Console.WriteLine ("פתיל ראשון:" + i);

            }

        }

        בטל סטטי שיטה 2 ()

        {

            עבור (int i = 0; i <10; i ++)

            {

                Console.WriteLine ("חוט שני:" + i);

            }

        }

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

חוטים יקרים. הם צורכים הרבה משאבים במערכת שלך לצורך אתחול, החלפת הקשר ושחרור המשאבים שהם צורכים. כתוצאה מכך יש להשתמש בהשבת משנה ברב השכל ורק כאשר יש צורך בכך. כשאתה מנצל ריבוי הליכי משנה, תמיד מומלץ למנף מאגרי אשכולות כדי ליצור ולנהל שרשורים לפי דרישה ולשפר את היענות היישום שלך.