בפוסט זה אסביר מה הם היתרונות בשימוש ב- System.Threading.Tasks.Task אשר זמין החל מ-.net framework 4.0 ומדוע כבר אין כל סיבה לעבוד מול System.Threading.Thread, אך תחילה אסביר מי מחלקה זו ומתי נרצה להשתמש בה.
אנו נרצה להשתמש במחלקה זו במקרים בהם נרצה לבצע פעולות במקביל, כאשר זה מאפשר למפתחים למנף את העוצמה של מעבדים מרובי ליבה בצורה יעילה
ה-Task הוא אובייקט קל-משקל לניהול יחידות עבודה אשר עובדות במקביל, הוא מונע את התקורה של יצירת Thread ייעודי לכל פעולה אשר צריכה להתבצע במקביל, במקום זאת הוא עובד מול ה-thread pool (גם ThreadPool.QueueUserWorkItem משתמש באותו ה-thread pool) ומספק לדורש thread אשר זמין לעבודה (זוהי ההתנהגות הדיפולטיבית, ניתן להגדיר אחרת)
לדעתי אלו היתרונות המרכזיים של השימוש ב-Task:
Waiting on Tasks
Handling Exceptions in Tasks
Return a Value from a Task
Canceling Tasks
Continuation Tasks
Waiting on Tasks
כאשר לדוגמא אנו רוצים שהתכנית שלנו תחכה לכל הפעולות הקורות במקביל ותסתיים רק לאחר שכל הפעולות הסתיימו נשתמש בפונקציה הסטאטית Task.WaitAll אשר יכולה גם מוגבלת בזמן ע”י טיים אאוט או לחילופין ע”י הפונקציה Task.WaitAny אשר תחכה לאחת מן הפעולות
1: public static void Main()
2: {
3: Task task1 = new Task(printDate);
4:
5: Task task2 = new Task(printDate);
6:
7: task1.Start();
8: task2.Start();
9: Task.WaitAll(task1, task2);
10:
11: Console.WriteLine("End of the program");
12:
13: }
14: private static void printDate()
15: {
16: Console.WriteLine(DateTime.UtcNow.ToString("dd/MM/yyyy HH:mm:ss:fff"));
17: }
פלט התוכנית:
27/02/2012 08:01:13:539
27/02/2012 08:01:13:539
End of the program
Press any key to continue . . .
Handling Exceptions in Tasks
ניתן לתפוס כל Exception הנזרק בפעולה המקבילה בצורה קלה מאוד, רק צריך לעטוף את פונקציית ה-Wait ע”י try catch ובמידה ונזרק שם Exception כלשהוא אזי הוא ייעטף ב-AggregateException אשר מכיל בתוכו את כל ה-Excetions אשר נזרקו משם, שוב פשוט וקל
Read more: הבלוג של יוסי חביה
QR:
0 comments:
Post a Comment