תכנות אסינכרוני מבוא.

Slides:



Advertisements
Similar presentations
Completeness and Expressiveness. תזכורת למערכת ההוכחה של לוגיקה מסדר ראשון : אקסיומות 1. ) ) (( 2. )) ) (( )) ( ) ((( 3. ))) F( F( ( 4. ) v) ( ) v ((
Advertisements

ממיבחניםC שאלות ++.
תוכנה 1 סמסטר א ' תשע " ב תרגול מס ' 7 * מנשקים, דיאגרמות וביטים * לא בהכרח בסדר הזה.
מבוא למדעי המחשב לתעשייה וניהול
בתרגול הקודם הורשה: –ניתן להרחיב רק מחלקה אחת –כל מה שלא private – עובר בהורשה –המילה השמורה super –יצירת היררכיה –Object היא שורש ההיררכיה –דריסה אופרטור.
תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1 ואפליקציות ל- Windows Phone 8 סילבוס הקורס.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב'
חורף - תשס " ג DBMS, Design1 שימור תלויות אינטואיציה : כל תלות פונקציונלית שהתקיימה בסכמה המקורית מתקיימת גם בסכמה המפורקת. מטרה : כאשר מעדכנים.
תכנות תרגול 2 שבוע : שבוע שעבר כתבו תוכנית המגדירה שלושה משתנים מאתחלת אותם ל 1 2 ו 3 ומדפיסה את המכפלה שלהם את ההפרש שלהם ואת הסכום שלהם.
מבוא למדעי המחשב תרגול 8 - מחרוזות שעת קבלה : יום שני 11:00-12:00 דוא " ל :
חורף - תשס " ג DBMS, צורות נורמליות 1 צורה נורמלית שלישית - 3NF הגדרה : תהי R סכמה רלציונית ותהי F קבוצת תלויות פונקציונליות מעל R. R היא ב -3NF.
Map-Reduce Input: a collection of scientific articles on different topics, each marked with a field of science –Mathematics, Computer Science, Biology,
1 Formal Specifications for Complex Systems (236368) Tutorial #5 Refinement in Z: data refinement; operations refinement; their combinations.
Formal Specifications for Complex Systems (236368) Tutorial #6 appendix Statecharts vs. Raphsody 7 (theory vs. practice)
תכנות תרגול 6 שבוע : תרגיל שורש של מספר מחושב לפי הסדרה הבאה : root 0 = 1 root n = root n-1 + a / root n-1 2 כאשר האיבר ה n של הסדרה הוא קירוב.
תהליכים  מהו תהליך ?  מבני הנתונים לניהול תהליכים.  החלפת הקשר.  ניהול תהליכים ע " י מערכת ההפעלה.
משטר דינמי – © Dima Elenbogen :14. הגדרת cd ו -pd cd - הזמן שעובר בין הרגע שראשון אותות הכניסה יוצא מתחום לוגי עד אשר אות המוצא יוצא מתחום.
עקרון ההכלה וההדחה.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב' Templates תבניות.
מבוא למדעי המחשב תרגול 3 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
מבוא למדעי המחשב, סמסטר א ', תשע " א תרגול מס ' 1 נושאים  הכרת הקורס  פסאודו - קוד / אלגוריתם 1.
Markov Decision Processes (MDP) תומר באום Based on ch. 14 in “Probabilistic Robotics” By Thrun et al. ב"הב"ה.
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
Text to speech In Mobile Phones איתי לוי. הקדמה שימוש בהודעות טקסט על המכשירים הסלולארים היא דרך תקשורת מאוד פופולארית בימינו אשר משתמשים בה למטרות רבות,
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
פיתוח מערכות מידע Class diagrams Aggregation, Composition and Generalization.
Methods public class Demonstrate { public static void main (String argv[]) { public static void main (String argv[]) { int script = 6, acting = 9, directing.
Practice session 3 תחביר ממשי ( קונקרטי ) ותחביר מופשט ( אבסטרקטי ) שיטות חישוב : Applicative & Normal Evaluation Partial Evaluation.
תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1 ואפליקציות ל- Windows Phone 8 Control (Part II)
מבוא למדעי המחשב לתעשייה וניהול הרצאה 7. סברוטינות subroutines.
Practice session 3.  תחביר ממשי ( קונקרטי ) ותחביר מופשט ( אבסטרקטי )  שיטות חישוב : Applicative & Normal Evaluation.
 Client, Supplier ומה שביניהם ( ADT!).  שאלה 1: יצירת ADT עבור מעגל במישור נניח שלקוח מעוניין בפעולות הבאות : הזזת מעגל וחישוב שטח מעגל. הספק יספק ללקוח.
1 המרכז להוראת המדעים © האוניברסיטה העברית בירושלים פולימורפיזם מתקדם ממשקים בג ' אווה 1.
The Past Progressive (Past Continuous)
שיאון שחוריMilOSS-il מוטיבציה  python זה קל ו C זה מהיר. למה לא לשלב?  יש כבר קוד קיים ב C. אנחנו רוצים להשתמש בו, ולבסס מעליו קוד חדש ב python.
תכנות מכוון עצמים ושפת ++C וויסאם חלילי. TODAY TOPICS: 1. Function Overloading & Default Parameters 2. Arguments By Reference 3. Multiple #include’s 4.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 12. ספריות.
1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1.
1 נתבונן בפונקציה הבאה public static int min(int[] a,int n) { int min = a[0]; for (int i = 1; (i < n ) && (i < a.length) ; i++) if (min > a[i]) min = a[i];
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site:
עקרונות תכנות מונחה עצמים תרגול 11: OOP in C++. Outline  Where do the objects live ?  Inheritance  Slicing  Overriding vs Shadowing.
Overview of C#. Agenda Structure of a C# Program Basic Input/Output Operations Compiling, Running, and Debugging Namespaces.
האוניברסיטה העברית בירושלים
מספרים אקראיים ניתן לייצר מספרים אקראיים ע"י הפונקציה int rand(void);
Tirgul 12 Trees 1.
Computer Architecture and Assembly Language
Operators Overloading
Formal Specifications for Complex Systems (236368) Tutorial #1
מחלקות classes.
מבוא למדעי המחשב סיבוכיות.
Present simple הווה פשוט
תוכנה 1 תרגול 13 – סיכום.
תוכנה 1 תרגול 13 – סיכום.
SQL בסיסי – הגדרה אינדוקטיבית
תרגול מס' 3: Data Hazards מבוסס על תרגול של מורן גביש
פיתוח אפליקציות אסינכרוניות Windows 10
תכנות מכוון עצמים בשפת JAVA
תיאוריית תכנון סכמות למסדי נתונים יחסיים חלק 4
Asynchronous programming
ניתוח מערכות מידע תכנות ב C#
תכנות מכוון עצמים ושפת JAVA
מבוא לתכנות מונחה עצמים Object Oriented Programming
Shell Scripts בסביבת UNIX
תוכנה 1 תרגול 13 – סיכום.
תוכנה 1 תרגול 13 – סיכום.
פיתוח אפליקציות אסינכרוניות Windows 10
Computer Programming תרגול 3 Summer 2016
Engineering Programming A
Computer Architecture and Assembly Language
פולימורפיזם מתקדם ממשקים בC# עריכה ועיצוב: קרן הרדי
Presentation transcript:

תכנות אסינכרוני מבוא

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

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

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

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

דוגמה מהחיים - ארוחת ערב סינכרונית מטלות ציר הזמן

דוגמה מהחיים - ארוחת ערב אסינכרונית מטלות ציר הזמן

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

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

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

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

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

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

תכנות אסינכרוני ברוכים הבאים למהפכה האסינכרונית של מיקרוסופט. החל מגרסתה הרביעית מציגהNET Framework גישה פשוטה יותר לתכנות אסינכרוני, גישה ששודרגה כאשר יצאה הגרסה הבאה - NET Framework 4.5. היכולות האסינכרוניות החדשות באו לעולם ביחד עם C# 5. בגישה החדשה הקומפיילר אחראי על ביצוע העבודה האסינכרונית הקשה והמורכבת שהמתכנתים נאלצו לעשות בעבר, בעוד שהיישום שומר על מבנה דומה לקוד הסינכרוני שכתבנו עד היום. אנו נתמקד ביכולת של .NET Framework 4.5 ו- C# 5.0

Win-Win תכנות אסינכרוני אנו נהנים מכל היתרונות של תכנות אסינכרוני תוך שמירה על המבנה הרגיל והמוכר של הקוד ובהשקעה קטנה של מאמץ. Win-Win במילים אחרות, ללכת עם ולהרגיש בלי, נכתוב קוד שנראה כמו הקוד הסינכרוני המוכר והאהוב אבל מתנהג כמו שקוד אסינכרוני אמור להתנהג.

ספרית TPL – Task Parallel Library ספריית ה-TPL מורכבת מסדרה של טיפוסים וממשקי משתמש המוגדרים במרחב השמות System.Threading.Task. המטרה בבנייתה של הספרייה הייתה להנגיש את הפיתוח האסינכרוני על ידי הפיכתו לפשוט וקל יותר להבנה ולפיתוח, בין השאר, על ידי שמירה על מבנה תוכנית שמתכנתים התרגלו אליו.

ספרית TPL – Task Parallel Library לוקח על עצמו את הניהול ברמת ה- Low Level של המקטעים האסינכרוניים. מבצע פעולות רבות נוספות המקלות עלינו מאוד.

ספרית TPL – Task Parallel Library הרבה יותר קל לכתוב ולתחזק פעילות אסינכרונית באמצעות Task משום שהיא מסתירה את המורכבות שהייתה נחלתנו בעבר בבואנו לפתח פעילות אסינכרונית באמצעות Thread.

ספרית TPL – Task Parallel Library המחלקהTask משתמשת ב-Thread Pool על מנת לנהל את המשימות האסינכרוניות. מה זה ThreadPool? מנגנון תוכנה אשר מנהל את ביצוע אוסף התהליכים (Threads ) שרצים במחשב בצורה אוטומטית.

ספרית TPL – Task Parallel Library Thread Pool גודלו של ה- Thread Pool הוא דינמי ובהתאם לכך גם המשאבים שהוא צורך משתנים בהתאם לעומס העבודה הנוכחי וזמינות החומרה הפנויה. כמות המשימות שהוא יריץ במקביל תלויה בכמות המשימות שממתינות בתור ובמשאבים הפנויים של המערכת. מכיל גם Worker Threads וגם I/O Completion Thread אשר מנהלים את פעילות ה-I/O האסינכרונית. לכל Process ה- CLR מקצה Thread Pool. יודע לנהל כמות גדולה מאוד של משימות אסינכרוניות , כברירת מחדל ה-Thread Pool מסוגל לטפל ב-1000 I/O Completion Thread וב-25 Worker Threads לכל מעבד. כמות המשימות שנמצאות בתור מוגבלת רק על ידי כמות הזיכרון. למה צריך לנהל את ה-Threads? משום שמספר המשימות שרצות במקביל גדול ממספר המעבדים בפועל ולכן צריך גורם שינהל ויתזמן את המשימות אל מול משאבי החומרה.

חסרונות .NET’s thread pool has some shortcomings which can affect the choice between using a dedicated thread instead of a thread from the thread pool. It is usually said that a dedicated thread is favourable in the following scenarios: - When a foreground thread is required: All thread pool threads are initialised as background threads. - When it is required to have a thread with a particular priority. - When a thread is required to be aborted prematurely - When a thread must be placed in a single-threaded apartment (STA): All thread pool threads are set in the MTA apartment by default - For long running tasks when the thread pool thread is often blocked for long periods (This may starve other parts of the application which rely on threads from the thread pool)

ספרית TPL – Task Parallel Library

המחלקה Task המחלקה Task היא אחת המחלקות המרכזיות במודל האסינכרוני החדש של NET Framework. המחלקה מוגדרת במרחב השמות System.Threading.Tasks אשר ייחוס אליו מופיע כברירת מחדל ב- Visual Studio 2015. המחלקה Task מייצגת פעולה אסינכרונית אשר לא מחזירה ערך. הפעולה המבוצעת על ידי המחלקה Task היא אסינכרונית ומנוהלת על ידי ה- Thread Pool. בדרך כלל נשתמש ביטויי למבדה על מנת לממש את הפעולה ש-Task מבצעת. יחידת הקוד המורצת על ידיTask יכולה לרוץ אסינכרונית בתהליך נפרד או בצורה סינכרונית באותו התהליך בו ה- Task נוצר והופעל.

public static Task Run(Action action) public delegate void Action() המתודה Run מעבירה משימה לתור המשימות של ה-ThreadPool. המתודה מקבלת כפרמטר delegate מטיפוס Action, ה-delegate מוגדר ב- .NET Framework בצורה הבאה: public delegate void Action() דהיינו, יכול להתייחס למתודה שאינה מקבלת פרמטרים ואינה מחזירה ערך. המתודה אשר תשלח ל-Run תבוצע אסינכרונית.

המחלקה Task דוגמה ראשונה: השימוש הפשוט ביותר. class Program { static void Main(string[] args) Task.Run(() => Console.WriteLine("Hello Async world ...")); Console.WriteLine("Message from Main"); Console.ReadLine(); } דוגמה ראשונה: השימוש הפשוט ביותר. המתודה Task.Run(…) מקבלת ביטוי למבדה המתאים ל- delegate Action ומעבירה את התהליך האסינכרוני לתור התהליכים של ה- Thread Pool. דוגמת קוד: TaskSample01

המחלקה Task class Program { static void Main(string[] args) Task.Run(() => Console.WriteLine("Hello Async world ...")); Console.WriteLine("Message from Main"); Console.ReadLine(); } התהליכים המנוהלים ב-Thread Pool רצים ברקע (Background Thread) ולכן הם מסתיימים אוטומטית כאשר Main מסתיימת. לכן ב-Console Application מומלץ להוסיף Console.ReadLine() על מנת שנוכל לראות הפלט הנשלח למסך לפני שהוא נסגר.

המחלקה Task לא חובה להשתמש בלמבדה, אפשר להשתמש בגישה המסורתית: ניתן להגדיר מתודה (DoSomethingAsync בדוגמה) להקצות מופע של delegate Action ולהעביר אותו ל-Task.Run. אבל כאשר יש למבדה מי בכלל ירצה להשתמש בשיטה המסורתית? static void Main(string[] args) { Action action = new Action(DoSomethingAsync); Task.Run(action); Console.WriteLine("Message from Main"); Console.ReadLine(); } public static void DoSomethingAsync() Console.WriteLine("Hello Async world ...");

המחלקה Task דוגמה שניה: הרצת מספר מטלות בתהליכים נפרדים מטלה ראשונה static void Main(string[] args) { Task.Run(() => for(int i=0;i<100;i++) Console.ForegroundColor = ConsoleColor.Blue; Console.Write("Task1 - {0}, ", i); } }); for (int i = 0; i < 100; i++) Console.ForegroundColor = ConsoleColor.Red; Console.Write("Task2 - {0}, ", i); Console.ForegroundColor = ConsoleColor.Green; Console.Write("Task3 - {0}, ", i); Console.ReadLine(); המחלקה Task מטלה ראשונה דוגמה שניה: הרצת מספר מטלות בתהליכים נפרדים מטלה שניה מטלה שלישית דוגמת קוד: TaskSample02

המחלקה Task דוגמה שלישית: הרצה סינכרונית במחלקהTask מוגדרת המתודה RunSynchronously המריצה את המטלה בצורה בסינכרונית. בניגוד למתודה Task.Run(…) היא אינה סטאטית ולכן יש להקצות אובייקט מהמחלקה Task על מנת להשתמש בה : class Program { static void Main(string[] args) Task task = new Task(() => { Console.WriteLine("Task - {0}", Thread.CurrentThread.ManagedThreadId); }); task.RunSynchronously(); //task.Start(); Console.WriteLine("Main - {0}", Thread.CurrentThread.ManagedThreadId); Console.ReadLine(); } על פי הפלט ניתן להבחין שה- Thread ID של שתי המטלות זהה ולכן הן רצות בצורה סינכרונית דוגמת קוד: TaskSample03

המחלקה Task גישה אחרת – שימוש באובייקט מהמחלקה Task: static void Main(string[] args) { Task task = Task.Run(() => for(int i=0;i<100;i++) Console.ForegroundColor = ConsoleColor.Blue; Console.Write("Task1 - {0}, ", i); } }); Console.WriteLine (task.IsCompleted); // False task.Wait();

המחלקה Task<TResult> בדוגמאות הקודמות הכרנו את Task.Run(Action action) הרצנו תהליכים שלא קיבלו פרמטרים ולא החזירו תשובה. זה האופי של delegate Action. לעיתים קרובות נרצה שתהליכים יחזירו את תוצאת החישוב שמתבצע. לטובת מקרים אלו העמיסו Method Overloading)) את המתודה Task.Run.

המחלקה Task<TResult> אחת ההעמסות היותר פופולאריות משתמשת ב-delegate Func במקום ב- delegate Action. Func יכולה לקבל פרמטרים ולא פחות חשוב מכך יכולה להחזיר את תוצאת החישוב. המחלקה Task<TResult> יורשת את המחלקה Task. חתימה: public static Task<TResult> Run<TResult>(Func<TResult> function)

המחלקה Task<TResult> המתודה Task.Run(…) אינה מקבלת פרמטרים אולם מחזירה את תוצאת החישוב. את תוצאת החישוב נקבל במאפיין Task<TResult> Result. במקרה זה, הפעלנו את המתודהRun אשר מקבלת את delegate Func: public delegate TResult Func<out TResult>() המשך ביצוע המתודה יושהה עד שהמאפיין יוכל להחזיר ערך. class Program { private static Random rnd = new Random(); static void Main(string[] args) Task<int> result = Task.Run(() => { return rnd.Next(1, 100); }); Console.WriteLine(result.Result); Console.ReadLine(); } דוגמת קוד: AwaitableTaskTResult01

המחלקה Task<TResult> static void Main(string[] args) { Console.WriteLine("Start running..."); Task<int> result = Task.Run(() => { return CalcPrimeNumbers(300000); }); Console.WriteLine("The answer is {0}", result.Result); Console.ReadLine(); } public static int CalcPrimeNumbers(int num) int count = 0; for (long i = 0; i <= num; i++) . . . return count; Task<TResult> הדוגמה הבאה תמחיש את ההשהיה בצורה ברורה. המתודה CalcPrimeNumbers מחשבת את מספר המספרים הראשוניים בטווח שבין 0 למספר שנשלח כפרמטר (הקוד המלא מופיע בדוגמת הקוד). לוקח זמן עד שהמתודה מסיימת את המטלה ומחזירה את התשובה, בינתיים ההמשך של המתודהMain מושהה.

המחלקה Task<TResult> ניתן לסכם (בינתיים) ולומר שתפקידה של Task<TResult> הוא להבטיח תשובה עתידית, להבטיח את קיומו של הערך המוחזר (מטיפוס T). התשובה (תוצאת הפעילות האסינכרונית) תהיה זמינה בעתיד, ברגע שהפעולה המתמשכת תסתיים. קצת תחושה של סינכרוניות? נפתור את זה אוטוטו. הדפסת התשובה המתנה לתשובה

המחלקה Task<TResult> איך משפרים את תחושת הסינכרוניות של הדוגמה הקודמת? איך גורמים לתוכנית להמשיך בביצוע הרגיל ולא להמתין לסיום התהליך? באמצעותTaskAwaiter המכונה Awaiter object. Awaiter object הוא אובייקט מהמבנהTaskAwaiter<TResult> האובייקט נוצר על ידי ה- Task. ב- Awaiter object מוגדר אירועOnCompleted אשר מופעל כאשר התהליך סיים את פעולתו. באירועOnCompleted נדאג לקבל את תוצאת החישוב שהתבצע על ידי ה-Task במקום להמתין ל-Task.Result שמעכב את ביצוע התוכנית עד לקבלת תוצאת החישוב של התהליך.

המחלקה Task<TResult> static void Main(string[] args) { Console.WriteLine("Start running..."); Task<int> task_result = Task.Run(() => { return CalcPrimeNumbers(300000); }); var awaiter = task_result.GetAwaiter(); awaiter.OnCompleted(() => result = awaiter.GetResult(); Console.WriteLine("The answer is {0}", result); }); Console.WriteLine("Main continue ......"); Console.ReadLine(); } public static int CalcPrimeNumbers(int num) int count = 0; . . . return count; Task<TResult>

async Task<int> AccessTheWebAsync(){…} Async and Await async המילים השמורות async ו-await הם לב ליבו של התכנות האסינכרוני ב- C# 5 המילים השמורות הללו מסתירות בחובן יכולת לכתוב מתודות אסינכרוניות בצורה ברורה ונהירה כמעט כמו שכותבים מתודות סינכרוניות. באמצעות async מתווספת לחתימה של המתודה באמצעותה אנו מכריזים שהמתודה היא מתודה אסינכרונית. לדוגמה: async Task<int> AccessTheWebAsync(){…} מקובל ששם המתודות האסינכרוניות יסתיים ב-Async.

Async and Await async הערך המוחזר של מתודה אסינכרונית יכול להיות אחת מהשלוש: Task<TResult> - אם המתודה מחזירה ערך. Task - אם המתודה אינה מחזירה ערך. void - כאשר כותבים מתודה המטפלת אסינכרונית באירוע. במתודה אסינכרונית ניתן להשתמש במילה השמורה await

Int result = await AccessTheWebAsync(); Async and Await await האופרטורawait משמש במתודה אסינכרונית על מנת להשהות את הביצוע של המתודה עד לסיום הביצוע של הפעולה שצמודה אליה (מכונה awaited task) המתודה האסינכרונית ממשיכה להתבצע ללא הפרעה עד אשר יש צורך להשתמש בערך המוחזר של משימה המופעלת בתוכה. Int result = await AccessTheWebAsync();

Async and Await דוגמה: private async void btn1_Click(object sender, RoutedEventArgs e) } txtState.Text = "btn1_Click started"; await LongRunningFunc1(); txtState.Text = "btn1_Click finished"; { private async Task LongRunningFunc1() } txt1.Text = "Processing 1 ....."; btn1.Content = "Wait"; await Task.Delay(5000); txt1.Text = "Hello From Func1"; btn1.Content = "Click"; { AsyncSample01

Async and Await בשתי גישות שונות גישה ראשונה: private async Task<int> LongRunningFunc1() } await Task.Delay(5000); int num = rnd.Next(1, 100); txt1.Text = num.ToString(); return num; { private async Task<int> LongRunningFunc2() txt2.Text = num.ToString(); בשתי גישות שונות גישה ראשונה: private async void btn1_Click(object sender, RoutedEventArgs e) } txtState.Text = "Start"; txt1.Text = "0"; Task<int> num1 = LongRunningFunc1(); Task<int> num2 = LongRunningFunc2(); txtState.Text = "Continue"; int result = await (num1) + await (num2); txtState.Text = "Finished"; txtSum.Text = result.ToString(); { AsyncSample02

Async and Await בשתי גישות שונות גישה שנייה: private async Task<int> LongRunningFunc1() } await Task.Delay(5000); int num = rnd.Next(1, 100); txt1.Text = num.ToString(); return num; { private async Task<int> LongRunningFunc2() txt2.Text = num.ToString(); בשתי גישות שונות גישה שנייה: private async void btn1_Click(object sender, RoutedEventArgs e) } txtState.Text = "Start"; txt1.Text = "0"; txt2.Text = "0"; int num1 = await LongRunningFunc1(); int num2 = await LongRunningFunc2(); txtState.Text = "Continue"; int n = num1 + num2; txtState.Text = "Finished"; txtSum.Text = (int.Parse(txt2.Text) + n).ToString(); { AsyncSample02

Async and Await private Task<FeedFile> Func1Async(string rss_url) } RssReader reader = new RssReader(); reader.FeedUrl = @"http://www.ynet.co.il/Integration/StoryRss2.xml"; return Task.Run(() => reader.Execute()); { private async void btn1_Click(object sender, RoutedEventArgs e) } FeedFile rss_file = await Func1Async(arr[0]); UpdateList(rss_file); { AsyncSample02

תכנות אסינכרוני