Asynchronous programming

Slides:



Advertisements
Similar presentations
Wenjin Xu. BasicsAllocationCollectionFinalization GC Mode Sample.
Advertisements

.NET Core Libraries Common Language Runtime CodeGen Garbage Collector Security Model Exception Handling Loader & Binder Profiling & Debugging APIs Entity.
Parallel Extensions to the.NET Framework Daniel Moth Microsoft
Copyright © 2012 Pearson Education, Inc. Chapter 9 Delegates and Events.
IAP C# Lecture 3 Parallel Computing Geza Kovacs. Sequential Execution So far, all our code has been executing instructions one after another, on a single.
Cole Durdan.  What is asynchronous programming?  Previous patterns  Task Based Async Programming .NET 4.5 Keywords  What happens in an async. method?
Chapter 14 Multithreading Yingcai Xiao. Multithreading is a mechanism for performing two or more tasks concurrently.  In the managed world of the common.
Threads in C# Threads in C#.
 2006 Pearson Education, Inc. All rights reserved Multithreading.
ThreadThread Thread Basics Thread Synchronization Animations.
A Bridge to Your First Computer Science Course Prof. H.E. Dunsmore Concurrent Programming Threads Synchronization.
EE2E1. JAVA Programming Lecture 8 Multi-threading.
Chapter 13 Working with Threads. Copyright 2006 Thomas P. Skinner2 Other Reference The book Programming Microsoft.NET by Jeff Prosise. Chapter 14 is excellent.
Object Oriented Programming Multithreading Dr. Mike Spann
Overview of Threading with the.NET Framework  Wallace B. McClure  Scalable Development, Inc. Scalable Development, Inc. Building systems today that perform.
CNS 3260 C# .NET Software Development
Parallel Programming: Responsiveness vs. Performance Joe Hummel, PhD Microsoft MVP Visual C++ Technical Staff: Pluralsight, LLC Professor: U. of Illinois,
Threads in Java. Processes and Threads Processes –A process has a self-contained execution environment. –Has complete set of runtime resources including.
C# I 1 CSC 298 Threads. C# I 2 Introducing Threads  A thread is a flow of control within a program  A piece of code that runs on its own. The execution.
1.NETConcurrent programmingNOEA / PQC 2007 Concurrent programming Threads –Introduction –Synchronization.
EE4E. C++ Programming Lecture 6 Advanced Topics. Contents Introduction Introduction Exception handling in C++ Exception handling in C++  An object oriented.
ADVANCED WEB SERVICES. Three Advanced Web Service Techniques SOAP Extensions Asynchronous calls Custom wire formatting SOAP Extensions Asynchronous calls.
 Joshua Goodman Group Program Manager Microsoft Corporation.
Sadegh Aliakbary Sharif University of Technology Fall 2010.
WHO WILL BENEFIT FROM THIS TALK TOPICS WHAT YOU’LL LEAVE WITH ASP.NET developers, including Web Forms & MVC History of async programming in.NET How async.
Laboratory - 4.  Threading Concept  Threading in.NET  Multi-Threaded Socket  Example.
Multithreading in Java Sameer Singh Chauhan Lecturer, I. T. Dept., SVIT, Vasad.
IAsyncResult ar = BeginSomething(…); // Do other work, checking ar.IsCompleted int result = EndSomething(ar);
Asynchronous Programming Writing Asynchronous Code in C# SoftUni Team Technical Trainers Software University
Module 8 Enhancing User Interface Responsiveness.
BİL527 – Bilgisayar Programlama I Functions 1. Contents Functions Delegates 2.
Object Oriented Programming Multithreading Dr. Mike Spann
Lecture 20 Threads Richard Gesick. Threads Makes use of multiple processors/cores if available Share memory within the program (as opposed to processes.
Exception Handling SWE 344 Internet Protocols & Client Server Programming.
CIS NET Applications1 Chapter 8 – Multithreading and Concurrency Management.
C# 5.0 Alex Davies 22 nd December What we will cover C# 5.0,.NET 4.5, Visual Studio 11 Caller Info Attributes Upgrade from synchronous to asynchronous.
V 1.0 OE-NIK HP 1 Advanced Programming Fundamentals of parallel execution Processes Threads.
Demonstrating Multithreading Concepts. Overvie w Multithreading or free-threading is the ability of an operating system to concurrently run programs that.
Asynchronous Programming Writing Concurrent Code in C# SoftUni Team Technical Trainers Software University
Methods Matthew Harrison. Overview ● There are five main aspects of methods... ● 1) Modifiers – public, private ● 2) Method Name ● 3) Parameters ● 4)
Lecture 6 Threads Erick Pranata
Segments Introduction: slides minutes
Threading Lecture 11 M. Ipalakova.
Jim Fawcett CSE681 – Software Modeling & Analysis Fall 2002
Thread Fundamentals Header Advanced .NET Threading, Part 1
Java Concurrency.
Async or Parallel? No they aren’t the same thing!
Section 5.7 Concurrency, Interference, and Synchronization.
Jim Fawcett CSE681 – Software Modeling and Analysis Fall 2005
Multithreading in Java
Introduction to C# AKEEL AHMED.
Distributed Systems - Comp 655
12 Asynchronous Programming
Exception Handling CSCI293 - C# October 3, 2005.
Multithreading 2 Lec 24.
Processes and Threads.
Multithread Programming
References and Objects
class PrintOnetoTen { public static void main(String args[]) {
Java Programming with Multiple Classes
.Net Sockets.
Threads and Concurrency
Chapter 13 Exception Handling: A Deeper Look
9. Threads SE2811 Software Component Design
9. Threads SE2811 Software Component Design
Jim Fawcett CSE681 – Software Modeling & Analysis Fall 2008
CMSC 202 Threads.
9. Threads SE2811 Software Component Design
Jim Fawcett CSE681 – Software Modeling & Analysis Fall 2008
Jim Fawcett CSE681 – Software Modeling & Analysis Fall 2008
Presentation transcript:

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

Process, App Domain and Thread Paramterised Threads Foreground and Background Threads Thread Priority Exception Handling

Process Process (יישום) הוא תוכנית הרצה במחשב. Process מריץ קובץ הרצה (EXE). Process מנוהל על ידי מערכת ההפעלה. יישום משמש לתיאור קבוצה של משאבים, כגון: הקצאות זיכרון, ספריות נחוצות, הקצאת זמן מעבד.... ומזוהה על ידי מספר ייחודי (PID) מבחינת מערכת ההפעלה כל Process רץ בנפרד ומבודד (Isolated process) משאר ה- Procceses. ההפרדה המוחלטת בין התהליכים משפרת את אמינות המערכת, נפילה של תהליך אחד לא משפיעה על תהליכים אחרים.

Process "תקיעה" מתרחשת כאשר ה-Thread עסוק בפעילות כבדה שגוזלת זמן. הוא נוצר עם הכניסה ל-Main ומסתיים כאשר Main מסתיימת. ליישומים שבהם תהליך יחיד מלווה הרבה פעמים המילה Unresponsive” " שבאה לתאר תגובות איטיות או תקיעה של המערכת המצבים מסוימים. "תקיעה" מתרחשת כאשר ה-Thread עסוק בפעילות כבדה שגוזלת זמן.

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

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

Process במרחב השמות System.Diagnostics ישנן כמה מחלקות אשר מאפשרות לחקור את ה- Processes שרצים במערכת: לדוגמה: המחלקה Process. List<MyProcess> processList = new List<MyProcess>(); … private void ReadProcess() { Process[] process_arr = Process.GetProcesses(); MyProcess my_process; foreach (var p in process_arr) my_process = new MyProcess(); my_process.PID = p.Id; my_process.ProcessName = p.ProcessName; my_process.ThreadCount = p.Threads.Count; processList.Add(my_process); } דוגמת קוד : ProcessInvestigating

AppDomain בעולם ה- .NET Framework קבצי הפעלה אינם מתארחים ישירות בתוך Process של מערכת ההפעלה. קובץ ההפעלה מנוהל על ידי תהליך לוגי הנקרא AppDomain. Process יכול להכיל מספר AppDomains, כל AppDomain יכול להכיל קובץ הרצה אחד בלבד. AppDomain מספקים רמת "בידוד" גבוהה מאוד, אין תלות בין התהליכים השונים. AppDomain משפרים ביצועים משום שתהליך אימות הקוד מפושט. בתוך Process יחיד של מערכת הפעלה ניתן להריץ מספר AppDomains מבלי שיהיה צורך להפעיל ולנהל Process עבור כל אחד מהם. * בהמשך נרחיב את היריעה על AppDomains

Asynchronous Programming עובדות: רוב האפליקציות צריכות להתמודד עם מספר מטלות המתרחשות בו בעת (Concurrency). די שכיח שאפליקציה צריכה להתמודד עם מטלה גדולה (או מאוד גדולה) שפתרונה גוזל זמן (או הרבה זמן). רב-משימתיות (Multi-Threading): מודל תכנות נפוץ המאפשר לתהליכים (Threads) רבים להתקיים במקביל בתוך יישום, התהליכים חולקים את משאבי היישום אולם כל אחד רץ בנפרד. בפועל - יכולת של יישום, תשתית תכנותית או מערכת הפעלה להריץ בו זמנית מספר מטלות. קוד סינכרוני – קוד אסינכרוני קוד סינכרוני הוא קוד שכל מטלה שמתבצעת חוסמת את המשך הריצה ואת ביצוע שאר המטלות עד לסיומה (Blocking Code). קוד הוא אסינכרוני אם הוא מסוגל להתמודד עם מספר מטלות בו בעת מבלי לחסום את שאר המטלות ומבלי להמתין עד שמטלה מסתיימת. לדוגמה: לקוח שולח בקשות לשרת, טיפול שרת בבקשות של לקוחות, גישה לדיסק, חישובים מורכבים, עיבוד תמונה .....

Asynchronous Programming קוד אסינכרוני (Async Programming) – קוד מקבילי (Parallel Programing) שני דברים שונים אבל מאוד דומים. קוד מקבילי הוא תמיד אסינכרוני. קוד אסינכרוני (Asynchronous) וקוד מקבילי (Parallel) ממומשים באמצעות Threads. בקוד אסינכרוני, קוד מסוגל להתמודד עם מטלות כבדות באמצעות Threads עצמאיים שאינם חוסמים את שאר התוכנית, לדוגמה: הורדת קובץ גדול מהאינטרנט אינה חוסמת את ה- UI והוא נשאר זמין למתכנת (Responsive UI). בקוד מקבילי הכוונה ביצוע של מטלה גדולה ומורכבת על ידי חלוקתה למספר Threads שרצים במקביל, לדוגמה: בעיבוד תמונה גדולה נחלק את התמונה ל-10 חלקים שווים, כל חלק יטופל על ידי Thread אחר, עם סיומם תוצג התוצאה. החפיפה היא גדולה מדי ולעיתים הגבול לא ברור דיו.

Threads Yes\No No התכנות מורכב, ארוך ויקר יותר. המורכבות לא באה לידי ביטוי ביצירת תהליכים אלא בניהול ובאינטראקציה ביניהם. התחזוקה מסובכת יותר, יקרה יותר וארוכה יותר. קשה יותר לבצע Debug. משלמים מחיר במשאבים – הקצאת תהליכים, החלפת תהליך פועל גוזלים משאבים, אם משתמשים בתהליכים בצורה מוגזמת המחיר יקר. בעבודה מול HD תהליך אחד או שניים משפרים יעילות, עודף תהליכים יגרום לאיטיות גדולה. Yes מניעת Unresponsiveness של ה- UI - כאשר תהליך מסוים "תוקע" את ממשק המשתמש נעדיף להריץ אותו ברקע כדי שהתוכנית תמשיך להתבצע כרגיל. פניה למחשב חיצוני לצורך קבלת שרות (WS, Database, לקוח אחר....) תהליך חישובי ארוך שגוזל זמן עיבוד וזמן מעבד. כאשר ניתן לפצל מטלה למספר מטלות משנה ובכך לנצל טוב יותר את משאבי המכונה בעלת מספר מעבדים.

public delegate void ThreadStart(); מרחב השמות System.Threading מגדיר מספר מחלקות וטיפוסים חשובים, בראשם המחלקה Thread. המחלקה Thread מאפשרת להריץ מטלה חדשה במקביל, לסיים הרצת מטלה פעילה, לקבל מידע על מטלה פעילה. יצירת והפעלת מטלה: מטלה רצה במסגרת מתודה שמכונה "מתודת עבודה" (Worker Method). כאשר מטלה מתחילה היא מפעילה מתודה, כאשר המתודה מסתיימת, מסתיימת איתה גם המטלה. המתודה מופעלת באמצעות Delegate ששמו: ThreadStart public delegate void ThreadStart(); ה-Delegate מגדיר את החתימה של המתודה, במקרה דנן, החתימה היא: void MethodName();

Delegate המכיל את מתודת העבודה של התהליך Threads static void WorkerMethod1() { int counter = 0; for (uint i = 0; i < 1000; i++) Console.ForegroundColor = ConsoleColor.Red; counter++; Console.WriteLine("WorkerMethod1 : counter : " + counter); } ThreadStart ts1 = new ThreadStart(WorkerMethod1); Thread t1 = new Thread(ts1); t1.Start(); מתודת העבודה של התהליך Delegate המכיל את מתודת העבודה של התהליך הגדרת ה- Thread הפעלת ה- Thread דוגמת קוד: FirstThreadSample

אפשרות נוספת להגדרת תהליך Threads static void WorkerMethod1() { int counter = 0; for (uint i = 0; i < 1000; i++) Console.ForegroundColor = ConsoleColor.Red; counter++; Console.WriteLine("WorkerMethod1 : counter : " + counter); } Thread t1 = new Thread(WorkerMethod1); t1.Start(); אפשרות נוספת להגדרת תהליך דוגמת קוד: FirstThreadSample

תרגילים 1 ו-2 מדף התרגילים תרגול תרגילים 1 ו-2 מדף התרגילים

Threads מה מתרחש מאחורי הקלעים? תהליכים מנוהלים על ידי רכיב ב-CLR הנקרא Thread Scheduler . תפקידו לקשר בין התהליך למערכת ההפעלה, להבטיח שלכל התהליכים הפעילים יוקצו משאבי עיבוד, ושתהליכים לא פעילים לא יבזבזו משאבי עיבוד. ל- Thread Scheduler אחריות רבה כי בדרך כלל רצים במחשב יותר תהליכים מאשר מספר המעבדים או הליבות. במחשבים עם מעבד אחד, הוא מבצע Time Slicing , דהיינו, מקצה "פרוסת זמן" לכל מעבד. עם תום הקצאת הזמן לתהליך משהה את התהליך הנוכחי ומעביר את משאב המעבד לתהליך הבא. במחשב מרובה מעבדים, מנהל את התהליכים באמצעות שילוב של הקצאת "Time Slice" ומקביליות אמתית. במקביליות אמתית תהליכים יכולים לרוץ במקביל על מעבדים שונים.

Threads Lifecycle http://www.informit.com/articles/article.aspx?p=31093&seqNum=2

Paramterised Threads מחלקת ה- Data public class Parameter { public int Num { get; set; } public ConsoleColor Color { get; set; } } static void WorkerMethod(object data) Parameter parameter = data as Parameter; for (int i = 0; i < parameter.Num; i++) Console.ForegroundColor = parameter.Color; Console.WriteLine("WorkerMethod : counter : " + i); Parameter param1 = new Parameter { Num = 100, Color = ConsoleColor.Red }; ParameterizedThreadStart pts1 = new ParameterizedThreadStart(WorkerMethod); Thread thread1 = new Thread(pts1); thread1.Start(param1); ומה עם רוצים פרמטרים? עם רוצים שכל Thread יבצע מספר שונה של איטרציות לדוגמה? בשביל זה יש את ParameterizedThreadStart: Worker Method הפעם עם פרמטר יצירת התהליך והרצתו עם פרמטר דוגמת קוד: ParameterizedThreadStartSample

Foreground and Background Threads תהליך יכול לפעול בשני מצבים: Foreground Thread – ברירת המחדל, התוכנית נשארת בחיים כל עוד התהליכים רצים. Background Thread – סיום התוכנית הורד את התהליך. class Program { static void WorkerMethod() for (int i = 0; i < 10; i++) Console.WriteLine("WorkerMethod : counter : " + i); } Console.WriteLine("End Of WorkerMethod"); static void Main(string[] args) ThreadStart ts = new ThreadStart(WorkerMethod); Thread t = new Thread(ts); t.Start(); Console.WriteLine("End Of Main"); Foreground Thread דוגמת קוד: ForegroundAndBackgroundThread

Foreground and Background Threads static void Main(string[] args) { ThreadStart ts = new ThreadStart(WorkerMethod); Thread t = new Thread(ts); t.IsBackground = true; t.Start(); Console.WriteLine("End Of Main"); } Background Thread

Thread Priority ניתן להגדיר "רמת הדחיפות" של כל תהליך באמצעות הגדרת Priority. חמש רמות של עדיפות: Lowest, BelowNormal, Normal, AboveNormal, Highest העדיפות משפיעה על ה- Time Slice שיקבל התהליך ביחס לשאר התהליכים של היישום. המשאבים של התהליך עדיין לא יכולים לחרוג מסך המשאבים של היישום. רצוי להימנע מלהגדיר עדיפות ביישומי UI, עלול להשפיע לרעה על מהירות העיבוד של החלון. ThreadStart ts1 = new ThreadStart(WorkerMethod1); Thread t1 = new Thread(ts1); t1.Priority = ThreadPriority.Highest; t1.Start(); Thread Priority

Exception Handling בלוק Try\Catch לא רלבנטי אם מתרחשת חריגה בתוך תהליך. זה אפילו מתבקש בשל העובדה שלתהליך יש נתיב ביצוע עצמאי. static void WorkerMethod() { int divider = 0; int num = 10 / divider; } static void Main(string[] args) try ThreadStart ts = new ThreadStart(WorkerMethod); Thread t = new Thread(ts); t.Start(); catch(Exception e) Console.WriteLine(e.Message); דוגמת קוד: ThreadException

Exception Handling חריגה בתהליך תגרום לנפילת כל היישום ולכן לא ניתן להתעלם מחריגות פנימיות בתהליכים. הפיתרון הוא לטפל בהם בשתי רמות: בלוק Try\Catch בתוך מתודת העבודה עצמה. האירוע AppDomain.CurrentDomain.UnhandledException – האירוע מופעל בכל פעם שיש חריגה לא מטופלת, אין ביכולתו למנוע את הקריסה, אלא רק ביצוע פעולות אחרונות (כמו שמירה, הודעה למשתמש) לפני הקריסה עצמה. ב- WPF יש אפשרות נוספת Application.DispatcherUnhandledException (עליה נדבר בהמשך) האירוע AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { Exception exception = e.ExceptionObject as Exception; Console.WriteLine(exception.Message); } הטיפול באירוע דוגמת קוד: ThreadException

תרגול תרגילים 3 מדף התרגילים

את הסילבוס, חומרים, מצגות ניתן להוריד ב: www.corner.co.il