תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- windows 8.1 ...

30
תתתתת תתתתתתתתת, תתתתתת תתתתתת תתתתתתתתת- תWindows 8.1 תתתתתתתתתת- תWindows Phone 8 Asynchronous programming

Upload: elijah-erickson

Post on 02-Jan-2016

36 views

Category:

Documents


2 download

DESCRIPTION

תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1 ואפליקציות ל- Windows Phone 8. Asynchronous programming. Thread Synchronization. עד כה, כל התהליכים שכתבנו רצו באופן בלתי מסונכרן. עד כה, כל התהליכים שכתבנו לא היו תלויים אחד בשני. עד כה, כל התהליכים שכתבנו לא עשו שימוש במשאבים משותפים. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

, תקשורת אסינכרוני תכנות- ל אפליקציות Windowsופיתוח

8.1- ל WindowsואפליקציותPhone 8

Asynchronous programming

Page 2: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

Thread Synchronization. , מסונכרן בלתי באופן רצו שכתבנו התהליכים כל כה עד

. , בשני אחד תלויים היו לא שכתבנו התהליכים כל כה עד

. , משותפים במשאבים שימוש עשו לא שכתבנו התהליכים כל כה עד

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

. מסוכנת להיות יכולה כאלו במצבים אסינכרוניות

Page 3: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

Thread Synchronization לכולם או לחלקם במקביל תהליכים מספר רצים בתוכנית כאשר

. המשותף למידע גישה יש

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

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

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

:הסכנות. אחר תהליך ידי על שנשמר מידע להרוס יכול תהליך. אחר תהליך ידי על ששונה מידע על להסתמך יכול תהליך יציב לא מידע על להסתמך יכול תהליך

) עבודתו) את להשלים הספיק שהוא לפני הסתיים תהליך

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

X = rnd.Next();Y = rnd.Next();X = rnd.Next();Y = X;

למה?

Page 4: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

Thread Synchronizationנפרד: – תהליך ללא א שלב לדוגמה

: דוגמה ThreadProblemקוד

public class SampleClass { private object threadLock = new object(); private int num; private Random rnd = new Random(); public void PrintNumbers() { Console.WriteLine("-> {0} is executing PrintNumbers()", Thread.CurrentThread.Name); Console.Write("Numbers: "); for (int i = 0; i < 10; i++) { Thread.Sleep(100 * rnd.Next(5)); num = i; Console.Write("{0}, ", num); } Console.WriteLine(); } }

static void Main(string[] args) { Thread.CurrentThread.Name = "Main Thread"; SampleClass p = new SampleClass(); //1 - Run method 10 time Console.ForegroundColor = ConsoleColor.Red; for (int i = 0; i < 10; i++) { p.PrintNumbers(); } }

משאב משותף

מתודת עבודה

המשאב שינויהמשותף

הפעלת המתודה

Page 5: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

Thread Synchronization: א שלב פלט

Page 6: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

Thread Synchronizationנפרד: – בתהליך ב שלב public class SampleClass לדוגמה

{ private object threadLock = new object(); private int num; private Random rnd = new Random(); public void PrintNumbersAsynch () { Console.WriteLine("-> {0} is executing PrintNumbers()", Thread.CurrentThread.Name); Console.Write("Numbers: "); for (int i = 0; i < 10; i++) { Thread.Sleep(100 * rnd.Next(5)); num = i; Console.Write("{0}, ", num); } Console.WriteLine(); } }

משאב משותף

מתודת עבודה

המשאב שינויהמשותף

static void Main(string[] args) { Console.ForegroundColor = ConsoleColor.Green; Thread[] threads_arr1 = new Thread[10]; for (int i = 0; i < 10; i++) { threads_arr1[i] = new Thread (new ThreadStart(p.PrintNumbersAsynch)); threads_arr1[i].Name = string.Format("Worker thread #{0}", i); } foreach (Thread t in threads_arr1) t.Start(); }

הפעלת המתודה

יצירת תהליכים

Page 7: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

Thread Synchronization: ב שלב פלט

Page 8: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

Thread Synchronization

. בעיה פה שיש ברור

ברור לא משהו היא והתוצאה שרצים התהליכים לכל המשותף ערך להדפיס מבקש תהליך כל. יציב ולא

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

. אסינכרוניים הם מטבעם הם תהליכים

, השמות מרחב הרב להכניס System.Threadingלמזלנו המאפשרות גישות כמה מממש. האסינכרוני בכאוס סינכרוני סדר

Page 9: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

Thread SynchronizationBlocking

נקראת לסינכרון ביותר הפשוטה .Simple Blockingאו Blockingהשיטה

( חסימה של במצב נמצא :Blockingתהליך מקרים( בשני המתודה .Thread.Sleepהפעלת מוגדר)…( – זמן לפרק התהליך חסימת המתודה .Thread.Joinהפעלת אחר)( - תהליך של לסיומו עד הנוכחי התהליך חסימת

, הקצאת מקבל לא הוא חסום במצב נמצא שתהליך CPU. static void Main(string[] args)בזמן { Thread thread = new Thread(DoSomething); thread.Start(); Console.WriteLine(thread.ThreadState); thread.Join(); Console.WriteLine(thread.ThreadState); Console.WriteLine("Application Ended successfully"); }

public static void DoSomething() { int counter=0; while (counter<10) { Thread.Sleep(2000); Console.WriteLine(DateTime.Now.ToLongTimeString()); counter++; } }

Blocking שניות 2של

עד ממתין הראשי התהליךהתהליך של threadלסיומו

: דוגמה ThreadBlockingקוד

Page 10: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

static decimal num1 = 1;static decimal num2 = 1;static Random rnd = new Random();static void WorkerThread1(){ var watch = Stopwatch.StartNew(); num1 = Fibonacci(rnd.Next(10,30)); watch.Stop(); Console.WriteLine("From WorkerThread1 : num1 = " + num1 + " , Working time: " + watch.ElapsedMilliseconds + " ms");}static void WorkerThread2(){ var watch = Stopwatch.StartNew(); num2=Fibonacci(rnd.Next(10,30)); watch.Stop(); Console.WriteLine("From WorkerThread2 : num2 = " + num2 + " , Working time: " + watch.ElapsedMilliseconds + " ms");}

Thread SynchronizationJoin – נוספת דוגמה

, שני בתוצאת תלוי הראשי התהליך נפרדים תהליכים בשני מסויים חישוב מתבצעהתהליכים:

: דוגמה ThreadJoinSampleקוד

Page 11: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

Thread SynchronizationJoin) המשך – ) נוספת דוגמה

static void Main(string[] args) { Thread t1 = new Thread(new ThreadStart(WorkerThread1)); t1.Start();

Thread t2 = new Thread(new ThreadStart(WorkerThread2)); t2.Start();

t1.Join(); t2.Join(); Console.WriteLine(num1 + num2);

}

לסיום המתנהשני

התהליכים

התלוי חישובשני בתוצאת

התהליכים

: דוגמה ThreadJoinSampleקוד

Page 12: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

Thread SynchronizationCritical Section

( קריטי התערבות( Critical Sectionמקטע ללא להתבצע שצריך קוד מקטע הוא. / משותף משאב של ביניים תוצאות תוצאות על להשפיע שעלול אחר תהליך של חיצונית

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

. : מלון בבית חדר להזמנת מערכת בעייתית דוגמה

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

: בעייתית לא דוגמה

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

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

Page 13: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

Thread SynchronizationCritical Section

: הבא הקוד של הפלט יהיה מה

class Program{ static void Main(string[] args) { Sample sample = new Sample(); Thread thread = new Thread(sample.DoTask1); thread.Start(); sample.DoTask1(); }}class Sample{ private bool flag; public void DoTask1() { if (!flag) { flag = true; Console.WriteLine("Done - " + Thread.CurrentThread.Name); } }} : קוד CriticalSectionProblem01דוגמת

Page 14: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

Thread Synchronizationלמה?

: קוד CriticalSectionProblem01דוגמת

Page 15: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

Thread Synchronization

: הבא הקוד של הפלט יהיה ומה

class Program{ static void Main(string[] args) { Sample sample = new Sample(); Thread thread = new Thread(sample.DoTask2); thread.Start(); sample.DoTask2(); }}class Sample{ private bool flag; public void DoTask2() { if (!flag) { Console.WriteLine("Done"); flag = true; } }}

: קוד CriticalSectionProblem01דוגמת

Page 16: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

Thread Synchronization?למה

Page 17: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

Thread Synchronization

: הבא מהקוד להיגרם העלולה הסכנה מה

class Program { static void Main(string[] args) { ThreadUnsafe sample = new ThreadUnsafe(); Thread thread = new Thread(sample.DoTask); thread.Start(); sample.DoTask(); } } class ThreadUnsafe { private int num1=10, num2=5; public void DoTask() { if (num2 != 0) { Console.WriteLine(num1 / num2); } num2 = 0; } } : קוד CriticalSectionProblem02דוגמת

Page 18: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

Thread Synchronization: מסוכן הוא הבא הקוד קטע

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

( " קריטי " מקטע נקרא (.Critical Sectionהוא

. יותר או תהליכים שני ידי על משותף במשאב משימוש נובע הוא

. " בלעדי" שימוש שיבטיח סנכרון מנגנון דורש קריטי מקטע

public void DoTask() { if (num2 != 0) { Console.WriteLine(num1 / num2); } num2 = 0; }

Page 19: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

Thread SynchronizationLock

למקטעים ביותר הפשוט נעילה מנגנוןקריטיים.

למקטע אקסקלוסיבית גישה מבטיחלמקטע, לגשת יוכל אחד תהליך רק קריטי

. בעת בו הקריטי

? למה: הפלט

class Program { static void Main(string[] args) { ThreadUnsafe sample = new ThreadUnsafe(); Thread thread = new Thread(sample.DoTask); thread.Start(); sample.DoTask(); } } class ThreadSafe { private int num1=10, num2=5; private object lockThis = new object(); public void DoTask() { lock (lockThis) { if (num2 != 0) { Console.WriteLine(num1 / num2); } num2 = 0; } } }

נעילה

אובייקט נעיל/ הסנכרון

ה

: קוד LockSample01דוגמת

Page 20: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

Thread Synchronization. אחד תהליך ידי על רק להינעל יכול הסנכרון אובייקט זמנית בו

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

. משותפים – משאבים על שמירה ברור היתרון

? ? המסקנה מה החיסרון lock (lockThis)מה{ if (num2 != 0) { Console.WriteLine(num1 / num2); } num2 = 0;}

: קוד LockSample01דוגמת

Page 21: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

Thread SynchronizationLock. סינכרון אובייקט מקבל

להיות יכול הסנכרון .thisאובייקט

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

. לנעילה בו להשתמש

של למצב להוביל שעלול .DeadLockמה

( מקטעים שני ומיותרת מרגיזה איטיות של למצב להוביל שעלול מה.) ננעלים משאבים משתפים שאינם

: פרטי בשדה שימוש הפיתרון

private object lockThis = new object;)(

של הקלעים המחלקה lockמאחורי .Monitorמסתתרת

lock (lockThis){ if (num2 != 0) { Console.WriteLine(num1 / num2); } num2 = 0;}

: קוד LockSample01דוגמת

Page 22: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

Thread Synchronization - ה את להכיר ?Worker Threadמבלי נעילה , מתבצעת היכן

' א 'אפשרות ב אפשרות

Page 23: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

Thread Synchronization

. מתודות שתי על מתבצעת הנעילה הפעם

באמצעות שננעל מאפשר lockאובייקט אינואפילו או אחרת מתודה על מדובר גם גישה

. אחרת מחלקה

public static void DoSomething01() { lock (locker) { for (int i = 0; i < 1000; i++) { Console.ForegroundColor = ConsoleColor.Red; Console.Write("X"); } } } public static void DoSomething02() { lock (locker) { for (int i = 0; i < 1000; i++) { Console.ForegroundColor = ConsoleColor.Green; Console.Write("Y"); } } } : קוד LockSample02דוגמת

Page 24: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

Thread SynchronizationDeadlock – שהתהליך בעוד החסימה את שישחרר שני לתהליך ממתין ראשון תהליך

. הראשון בתהליך החסימה לסיום ממתין השני public void Func1() { lock (lock1) { Console.WriteLine("Func1 -> lock1 activated"); Calc1(); } } public void Calc1() { lock (lock2) { Console.WriteLine("Func1 -> lock2 activated"); shared_num++; Console.WriteLine("From Func1: {0})", shared_num); } }

: קוד DeadlockSample01דוגמת

Page 25: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

Thread Synchronizationהמשך

public void Func2() { lock (lock2) { Console.WriteLine("Func2 -> lock2 activated"); Calc2(); } } public void Calc2() { lock (lock1) { Console.WriteLine("Func2 -> lock1 activated"); shared_num++; Console.WriteLine("From Func2: {0})", shared_num); } }

: קוד DeadlockSample01דוגמת

Page 26: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

Thread Synchronization

? חסימה נבצע מתיבלוק ואשר lockבתוך יותר או אחד שדה של ערך משנה אשר קוד מקטע כל נתחום

. תהליכים למספר נגיש

- ב לתחום צורך (.lockאין מזיק ) אפילו ערכים קוראים שרק מקטעים

Lock , רק לוקח מאוד מהיר .20ns (Nano Seconds)הוא

Page 27: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

Thread SynchronizationMonitor

השמורה " lockהמילה למחלקה קיצור כ סה .Monitorהיא

-intכמו .Int32ו

- ל -Monitor.Exitקריאה ל לקרוא .Monitor.Enterמבלי חריגה תעורר

class ThreadSafe { private int num1 = 10, num2 = 5; private object locker = new object(); public void DoTask() { Monitor.Enter(locker); if (num2 != 0) { Console.WriteLine(num1 / num2); } num2 = 0; Monitor.Exit(locker); } }

: קוד MonitorSampleדוגמת

Page 28: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

Thread SynchronizationMutex

כמוlock. הוגדר הוא בה האפליקציה לגבולות מעבר פועל אבל

Mutex הואComputer Wide. , שונות , אפליקציות בין גם חסימות לבצע יודע דהיינו

- ב .IPCשימושי

פי - 50איטי פעולה, lockמ .1msזמן

. בעת – בו לרוץ תוכל אפליקציה של אחד מופע שרק להבטיח מקובל שימוש

Semaphore

. " האסינכרוני" התכנות של הלילה מועדון

. תהליכים של מוגדר למספר רק גישה מאפשר

: קוד MutexSampleדוגמת

: קוד SemaphoreSampleדוגמת

Page 29: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8

: , , ב להוריד ניתן מצגות חומרים הסילבוס את

. . .www corner co il

Page 30: תכנות אסינכרוני, תקשורת ופיתוח אפליקציות ל- Windows 8.1  ואפליקציות ל- Windows Phone 8