PracticU

חידושים ב-C# ver 5

בלי כתוביותעם כתוביות
PracticU › קורס תכנות מתקדם - #Advanced .NET C › חידושים ב-C# ver 5
מילון מושגים:
C# - שפת תכנות מונחית עצמים של מיקרוסופט, המשמשת בעיקר לפיתוח יישומים על פלטפורמת .NET.
אסינכרוני - אופן פעולה שבו פעולה ארוכה רצה ברקע והתוכנית ממשיכה בלי להמתין לה, ומטופלת כשתסתיים.
פונקציה - קטע קוד בעל שם שמבצע משימה מוגדרת, מקבל ערכי קלט (פרמטרים) ויכול להחזיר תוצאה. מאפשרת לארגן קוד ולהשתמש בו שוב.
לולאה - מבנה בקרה שחוזר על קטע קוד שוב ושוב כל עוד תנאי מתקיים או עבור כל פריט באוסף.

חידושים ב-C# ver 5
השיעור מציג את C# 5, שיצאה ב-2012, ואת התכנות האסינכרוני בעזרת המילים async ו-await. הנושא מסביר איך פונקציה יכולה להתחיל פעולה ארוכה ולשחרר את הטרד, בלי לחסום את התוכנית.
הבעיה: פונקציה סינכרונית
1. הדוגמה: פונקציה שמחשבת סכום של מספרים מ-1 עד n, עם השהיה של שנייה בכל איטרציה. בלולאה שקוראת לה עשר פעמים, התוצאות מופיעות אחת לשנייה, כי כל קריאה ממתינה לסיום הקודמת.
שלב ראשון: Task בתוך הפונקציה
2. יצירת Task: הפעולה הכבדה עוטפת ב-Task, והפונקציה מפעילה אותו.
3. הבעיה: שליפת Result מה-Task כופה המתנה, ולכן הפונקציה עדיין חוסמת את הלולאה.
שלב שני: async ו-await
4. async: מילה שמורה שמסמנת את הפונקציה כאסינכרונית.
5. await: במקום Result כותבים await לפני ה-Task. הפונקציה מחזירה את הטרד למי שקרא לה, וממשיכה כשה-Task מסתיים.
6. ערך החזרה: הפונקציה עם await מוחזרת כ-Task, ואילו הקוד הפנימי כותב רק את הערך הרגיל.
7. סיום שם הפונקציה: מקובל לסיים את שם הפונקציה האסינכרונית במילה Async.
קריאה לפונקציה כמה פעמים
8. הריצה: הלולאה קוראת לפונקציה עשר פעמים בזה אחר זה בלי להמתין, והסכומים מופיעים מהר יותר. הסדר לא מובטח.
9. Task רבים: אפשר לשמור את כל ה-Tasks ברשימה, ואז לעבור עליהם ולשלוף את הערכים בעזרת Result. כשנשלפים הערכים כבר רצים במקביל.
10. הפונקציה שמחזירה ערך: כשהפונקציה מחזירה Task<int>, הקורא יכול לשלוף ממנה את התוצאה רק בסוף.
הצגה
11. Console.ReadLine: מונע מהתוכנית להיסגר לפני שהמשימות מסתיימות, כי ברירת המחדל של Task היא טרד ברקע.
ההבדל המרכזי הוא שהטרד לא נחסם בזמן ההמתנה, ולכן התוכנית ממשיכה לפעול.
השיעור הבא בקורס: תרגילים על חידושים ב-C# ver 5

פרקי ההרצאה: חידושים ב-C# ver 5

  1. 00:00

    תכנות אסינכרוני ב-C# 5

  2. 01:06

    פונקצייה סינכרונית לדוגמה

  3. 02:28

    הדגמת ריצה סינכרונית חוסמת

  4. 04:54

    בניית TASK בתוך הפונקצייה

  5. 08:16

    המילים async ו-await

  6. 10:14

    שחרור ה-THREAD בפועל

  7. 14:21

    מוסכמת הסיומת Async

תמלול ההרצאה: חידושים ב-C# ver 5

הטקסט המלא של הדקות הראשונות בהרצאה «חידושים ב-C# ver 5» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

    אוקיי אז אחרי שראינו C-Sharp 2 ו-C-Sharp 3 ו-C-Sharp 4 אנחנו מגיעים ל-C-Sharp 5. C-Sharp 5 יצא ב-2012 וכולל בעצם דבר אחד מרכזי שנקרא Asynchronous Programming שכבר אנחנו הולכים לראות מה זה אומר.

  2. 00:25

    שימו לב רק שעברנו מ-Visual Studio 2010 לגרסה של Visual סטודיו 2015 למרות שאפשר לבצע את זה בגרסת 2012 וגרסת 2013 אבל אסינכרוניס פרוגרמינג לא ניתן לביצוע בגרסת visualstudio.net 2010 לכן עברנו כרגע ל-2015 שזה מה שהתקנתי ממש עכשיו במחשב אז בואו נראה מה זה אומר בואו נניח שיש לנו כאן איזושהי

  3. 01:00

    פונקציה static void אני רוצה לבצע חישוב של סכום של מספרים נניח נקבל איזשהו מספר ואני רוצה לבצע חישוב של כל המספרים מאחד ועד המספר ואני מראה פה דוגמא לפונקציה שכביכול אמורה לקחת זמן וחשב את כל המספרים מאחד עד המספר לא אמור לקחת זמן אז אנחנו נבצע איזושהי הדמיה כאילו שזה לוקח הרבה זמן אז בואו נעשה פה איזשהו input sum ניגש לנולד 4 נתחיל

  4. 01:42

    מ-1 עד תנ"ם ומה שאנחנו רוצים לעשות זה פשוט מאוד שם פלוס שווה ל-i. כל הסיפור הזה בוא נניח שלוקח טיפה זמן אז נשים פה איזה spread.clip של שנייה אחת כל פעם שמחשבים לא משנה איזה מספר רוצים לחשב בוא נניח שאנחנו עושים המתנה של שנייה.

  5. 02:18

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

  6. 02:42

    גם כאן נתחיל מ-pad, כל עוד i קטן שווה ל-100. בואו נלך עד 10 ומה שנעשה זה פשוט נקרא לפונקציה calc, נגיד את זה בתוכה עם את הקריאה Calc Summary ואני רוצה לשלוח לה את i כפול 10. אם אנחנו נריץ עכשיו את התוכנית, כמובן כל הסיכום הזה יתבצע במשך 10 שניות וכל

  7. 03:21

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

  8. 03:52

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

  9. 04:14

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

  10. 04:38

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

  11. 04:54

    זה אומר שאנחנו צריכים בתוך הפונקציה קודם כל לבנות לעצמנו task אז בואו נבנה task t שווה new task ונגדיר שהtask הזאת תעשה את פעילות שאנחנו רואים כאן זאת אומרת אנחנו רוצים שהtask basically תבצע את כל הסיפור הזה יש לנו פה צורך לסגור את הפוגריים של התask נקודה פסיק בצורה כזאת עכשיו מה שאנחנו רואים כאן זה שהtask מבצעת איזושהי פעולת חישוב יותר רלגנטי יהיה

  12. 05:41

    שהטאסק פשוט תחזיר לנו את תוצאת החישוב זה יהיה כמובן החזרה של int מבצע את ההחזרה מפה עכשיו אנחנו יכולים לקחת את הקריאה את הטאסק בואו ניקח משתנה אחר שלא נתבלבל ביניהם את t.reason ונציג פה בחוץ את ה summary אנחנו עדיין בתוך הפונקציה talk summary אבל אנחנו מחוץ לפונקציה של הטאסק זאת אומרת השלב הראשון שהיינו צריכים לעשות ביצירת פונקציה

  13. 06:36

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

  14. 06:53

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

  15. 07:12

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

  16. 07:31

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

  17. 07:46

    הפונקציה CalcSummery. שם, בתוך הפונקציה CalcSummery, יש P.L.Result, ובדיוק בשורה הזאת יש כאן Raping for the task.

  18. 08:02

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

  19. 08:21

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

  20. 08:34

    זאת מילה שמורה שהתווספה רק ב-C-Sharp 5. פה אנחנו כותבים async ושימו לב שקיבלנו איזושהי הערה על Calc Summary וההערה אומרת שחסרה לנו עוד מילה אחת שנקראת ה-wait.

  21. 08:50

    אוקיי, את ה-await אנחנו מגדירים כאן. כאשר אנחנו משתמשים ב-await אנחנו לא צריכים להשתמש ב-t.result אלא אנחנו חייבים להגדיר ה-wait ל-t.

  22. 09:09

    זאת אומרת אנחנו ממתינים ל-t שה-task תסתיים בדיוק בנקודה הזאת וכאשר היא מסתיימת פקודת ה-wait לא מחזירה את ה-task אלא מחזירה את ה-result של ה-task. זאת הסיבה שאנחנו מגדירים פה סאמרי והכל נראה בסדר גמור.

  23. 09:34

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

  24. 10:04

    task שלכם ותחזירו את הערך הזה למשתנה שהוא מהטיפוס של הריזולט. אוקיי זה מבחינה טכנית מה קורה בפועל? מה שקורה בפועל זה שהפונקציה עכשיו calc summary הפכה להיות לפונקציה אסינכרונית.

  25. 10:24

    זה אומר שכאשר אנחנו קוראים לה אז הtask מתחילה להתבצע וברגע שאנחנו מגיעים ל-await קורים פה שני דברים דבר ראשון הפונקציה עצמה הפנימית ממתינה מה שכתוב פה הוא waiting ועדיין נכון מפני שאנחנו לא יכולים להשתמש בריזולט לפני שהפעולה הסתיימה אבל הדבר השני שקורה כאן הוא משחרר לנו את הקולינג טרד את הטרד הזה שקורה

  26. 11:03

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

  27. 11:26

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

  28. 11:56

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

  29. 12:21

    ואנחנו רואים גם שזה התבצע בחבילות כאלה מפני שכל טאסק בגלל שנפתחו לנו פה מספר טאסקים אבל שימו לב רק שזה לא התבצע בצורה סינכרונית ואנחנו אפילו יכולים לראות את החדר שלהם שימו לב 55 210 ואז היה אמור להיות 465 כי זה אמור להיות בחדר עולה אבל פתאום קפצנו פה 820 ואז 465 זאת אומרת החישוב

  30. 12:55

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

  31. 13:15

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

  32. 13:37

    אנחנו יכולים לראות גם כאן שה-2, 4085 הודפס אחרי ה-3240 כנ"ל פה 4095 לא דווקא 4095 הודפס במקום שלו אבל אנחנו רואים פה את הסוויץ' הזה זאת אומרת זה פעל הרבה יותר מהר אנחנו יכולים להריץ ולראות כל פעם שנריץ שימו לב את הצ'אנקים של ההדפסות והופה זה הסתיים הפכנו את הפונקציה לאפינכונית והצלחנו לבצע

  33. 14:07

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

  34. 14:29

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

  35. 14:45

    עכשיו אני רוצה לבצע שיטה נוספת בואו ניקח את הפונקציה הזאת ונקרא לה calc summary 1 async, נפיק אותה כדי שהפונקציה תישמר לכם בתרגילים

לקורס המלא: קורס תכנות מתקדם ב‑#C ודוט-נט

ההרצאה הקודמת: תרגילים על חידושים ב-C# ver 4

ההרצאה הבאה: תרגילים על חידושים ב-C# ver 5

הרצאות קשורות מקורסים אחרים

  • חידושים בשרת Hyper-V

קורסים נוספים במסלול

  • קורס WinForms - תוכנות רגילות בווינדוס
  • פרויקט מעשי ב-#C - בונים מחשבון פשוט
  • פרויקט מעשי ב-#C - ספר טלפונים
  • פרויקט מעשי ב-#C - תוכנת צייר
  • קורס ADO.NET - חיבור אתר למסד נתונים
  • קורס WCF - תקשורת למתקדמים בדוט-נט