Joe Hummel, PhD Microsoft MVP Visual C++ Technical Staff: Pluralsight, LLC Adjunct Professor: U.
Download ReportTranscript Joe Hummel, PhD Microsoft MVP Visual C++ Technical Staff: Pluralsight, LLC Adjunct Professor: U.
Joe Hummel, PhD Microsoft MVP Visual C++ Technical Staff: Pluralsight, LLC Adjunct Professor: U. of Illinois, Chicago and Loyola University Chicago email: [email protected] stuff: http://www.joehummel.net/downloads.html Motivation Execution model Parallel programming with Tasks Parallel programming with Async / Await Demos 2 Async programming: Parallel programming: Better responsiveness… Better performance… GUIs (desktop, web, mobile) Engineering Cloud Oil and Gas Windows 8 Pharma Science Social media Disk and network I/O number crunching and big data processing 3 Single core: Main Multicore: Task <<start Work>> if… while… Main thread Stmt1; Stmt2; Stmt3; Worker thread Threads share, run asynchr onously Main Task1 <<start Work1>> <<start Work2>> if… while… Main thread Task2 Stmt1; Stmt2; Stmt3; Stmt4; Stmt5; Stmt6; Worker thread Worker thread Threads run in parallel 4 Threads (.NET 1.0) Async Delegates QueueUserWorkItem BackgroundWorker Task Parallel Library (.NET 4.0) Async / Await (.NET 4.5) Easier… 5 Mandelbrot set… 6 Programming model based on concept of a Task Task == a unit of work; an object denoting an ongoing operation or computation. 7 Parallel.For( ... ); task tasktasktask Windows Process (.NET) App Domain App Domain App Domain Task Parallel Library worker thread worker thread worker thread worker thread Task Scheduler .NET Thread Pool global work queue Resource Manager Windows 8 Asian options financial modeling… 9 void button1_Click(…) { var result = DoLongLatencyOp(); lstBox.Items.Add(result); } void button1_Click(…) { var uictx = // grab UI thread context to run UI task: TaskScheduler.FromCurrentSynchronizationContext(); Task.Factory.StartNew(()=> { return DoLongLatencyOp(); } ).ContinueWith((antecedent) => { lstBox.Items.Add(antecedent.Result); }, uictx // execute this task on UI thread: ); } 10 void button1_Click(…) { var result = DoLongLatencyOp(); lstBox.Items.Add(result); } async void button1_Click(…) { Method *may* perform async, longlatency op var result = await Task.Run(() => DoLongRunningOp()); lstBox.Items.Add(result); } Tells compiler to setup a continuation to execute rest of method --- ON SAME THREAD CONTEXT --- and then returns from method so it doesn’t wait. 11 await must wait on a task ◦ implies underlying method must create & start a task… async void button1_Click(…) { var result = await Task.Run(() => DoLongRunningOp()); lstBox.Items.Add(result); } System.IO.FileStream file = ...; int read = await file.ReadAsync(buffer, offset, count); 12 Think chunky, not chatty ◦ i.e. designed for coarse-grain, long-latency operations ◦ file I/O, network I/O, compute-bound work… Think APIs exposing “TAP” pattern ◦ designed to take advantage of Task-based Asynchronous Pattern Synchronous System.IO.FileStream System.Net.HttpWebRequest System.Net.Http.HttpClient Asynchronous Read ReadAsync Write WriteAsync CopyTo CopyToAsync GetResponse GetResponseAsync GetRequestStream GetRequestStreamAsync N/A GetAsync N/A PostAsync,PutAsync,SendAsync Async web calls are a classic use-case private byte[] GetURLContents(string url) { var content = new MemoryStream(); var webReq = (HttpWebRequest)WebRequest.Create(url); Synchronous Version using (WebResponse response = webReq.GetResponse()) { using (Stream responseStream = response.GetResponseStream()) { responseStream.CopyTo(content); } } return content.ToArray(); } data = GetURLContents(“...”); // call and prepare to wait: 14 private async Task<byte[]> GetURLContentsAsync(string url) { var content = new MemoryStream(); var webReq = (HttpWebRequest)WebRequest.Create(url); Asynchronous Version using (WebResponse response = await webReq.GetResponseAsync()) { using (Stream responseStream = response.GetResponseStream()) { await responseStream.CopyToAsync(content); } } return content.ToArray(); } data = await GetURLContentsAsync(“...”); // call, start, don’t wait: Synchronous Version 15 Asynchronous web requests… 16 Return a task for caller to await upon… public int SomeOperation(...) { int result; result = ...; return result; } public Task<int> SomeOperationAsync(...) { return Task.Run<int>( () => { int result; result = ...; return result; } ); } 17 18 Thread-based execution model at the bottom Task-based execution model on top For Performance: ◦ Prefer Task Parallel Library For Responsiveness: ◦ Prefer Async / Await 19 Presenter: Joe Hummel ◦ Email: [email protected] ◦ Materials: http://www.joehummel.net/downloads.html For more info: ◦ MSDN Magazine, October 2011 (3 articles): 1. “Easier Asynchronous Programming with the New Visual Studio Async CTP” 2. “Pause and Play with Await” 3. “Async Performance: Understanding the Costs of Async and Await” 20