Pavel Yosifovich Hi-Tech College [email protected]

Embed Size (px)

Citation preview

  • Slide 1
  • Pavel Yosifovich Hi-Tech College [email protected] http://blogs.microsoft.co.il/blogs/pavely
  • Slide 2
  • C# Evolution Trends Synchronous vs. Asynchronous Asynchrony the old way The New Way Odds and Ends Summary
  • Slide 3
  • C# 1.0 Managed Code C# 2.0 Generics C# 3.0 Language Integrated Query C# 4.0 Dynamic Typing
  • Slide 4
  • Declarative ConcurrentDynamic
  • Slide 5
  • Increasingly connected applications More latency More UI responsiveness problems More scalability issues Asynchronous programming Becoming the norm in responsive, scalable apps Async-only APIs, e.g. JavaScript and Silverlight
  • Slide 6
  • C# 1.0 Managed Code C# 2.0 Generics C# 3.0 Language Integrated Query C# 4.0 Dynamic Typing Asynchronous Programming C# v.Next
  • Slide 7
  • Slide 8
  • Synchronous Wait for result before returning string DownloadString(...); Asynchronous Return now, call back with result void DownloadStringAsync(..., Action callback); Asynchronous work != Threads
  • Slide 9
  • var data = DownloadData(...); ProcessData(data); var data = DownloadData(...); ProcessData(data); DownloadDataAsync(..., data => { ProcessData(data); }); DownloadDataAsync(..., data => { ProcessData(data); });
  • Slide 10
  • var data = DownloadData(...); ProcessData(data); var data = DownloadData(...); ProcessData(data); DownloadDataAsync(..., data => { ProcessData(data); }); DownloadDataAsync(..., data => { ProcessData(data); });
  • Slide 11
  • Goal: Just like synchronous programming Framework: Use Task for all asynchrony Add Task support to existing.NET and Silverlight APIs Developers can do the same Languages: Asynchronous Methods async modifier marks method or lambda as asynchronous await operator yields control until awaited task completes
  • Slide 12
  • Represents ongoing operation Could be async I/O, background worker, anything... Single object for status, result and exceptions Composable callback model var task2 = task1.ContinueWith(t => t.Result ); The await operator rewrites to continuations Combinators WhenAll, WhenAny, Delay, etc.
  • Slide 13
  • async void DoWorkAsync() { var t1 = ProcessFeedAsync("www.acme.com/rss"); var t2 = ProcessFeedAsync("www.xyznews.com/rss"); await Task.WhenAll(t1, t2); DisplayMessage("Done"); } async void DoWorkAsync() { var t1 = ProcessFeedAsync("www.acme.com/rss"); var t2 = ProcessFeedAsync("www.xyznews.com/rss"); await Task.WhenAll(t1, t2); DisplayMessage("Done"); } async Task ProcessFeedAsync(string url) { var text = await DownloadFeedAsync(url); var doc = ParseFeedIntoDoc(text); await SaveDocAsync(doc); ProcessLog.WriteEntry(url); } async Task ProcessFeedAsync(string url) { var text = await DownloadFeedAsync(url); var doc = ParseFeedIntoDoc(text); await SaveDocAsync(doc); ProcessLog.WriteEntry(url); }
  • Slide 14
  • async void DoWorkAsync() { var t1 = ProcessFeedAsync("www.acme.com/rss"); var t2 = ProcessFeedAsync("www.xyznews.com/rss"); await Task.WhenAll(t1, t2); DisplayMessage("Done"); } async void DoWorkAsync() { var t1 = ProcessFeedAsync("www.acme.com/rss"); var t2 = ProcessFeedAsync("www.xyznews.com/rss"); await Task.WhenAll(t1, t2); DisplayMessage("Done"); } async Task ProcessFeedAsync(string url) { var text = await DownloadFeedAsync(url); var doc = ParseFeedIntoDoc(text); await SaveDocAsync(doc); ProcessLog.WriteEntry(url); } async Task ProcessFeedAsync(string url) { var text = await DownloadFeedAsync(url); var doc = ParseFeedIntoDoc(text); await SaveDocAsync(doc); ProcessLog.WriteEntry(url); }
  • Slide 15
  • async Task ProcessFeedAsync(string url) { var text = await DownloadFeedAsync(url); var doc = ParseFeedIntoDoc(text); await SaveDocAsync(doc); ProcessLog.WriteEntry(url); } async Task ProcessFeedAsync(string url) { var text = await DownloadFeedAsync(url); var doc = ParseFeedIntoDoc(text); await SaveDocAsync(doc); ProcessLog.WriteEntry(url); }
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Should be as simple as the synchronous case var wc = new WebClient(); try { string txt = await wc.DownloadStringTaskAsync(url); dataTextBox.Text = txt; } catch(WebException x) { // Handle as usual } var wc = new WebClient(); try { string txt = await wc.DownloadStringTaskAsync(url); dataTextBox.Text = txt; } catch(WebException x) { // Handle as usual }
  • Slide 31
  • async Task GetRssAsync(string url) { var client = new WebClient(); var task = client.DownloadStringTaskAsync(url); var text = await task; var xml = XElement.Parse(text); return xml; } async Task GetRssAsync(string url) { var client = new WebClient(); var task = client.DownloadStringTaskAsync(url); var text = await task; var xml = XElement.Parse(text); return xml; }
  • Slide 32
  • async Task GetRssAsync(string url) { var client = new WebClient(); var task = client.DownloadStringTaskAsync(url); var text = await task; var xml = XElement.Parse(text); return xml; } async Task GetRssAsync(string url) { var client = new WebClient(); var task = client.DownloadStringTaskAsync(url); var text = await task; var xml = XElement.Parse(text); return xml; } Task GetRssAsync(string url) { var $builder = AsyncMethodBuilder.Create(); var $state = 0; TaskAwaiter $a1; Action $resume = delegate { try { if ($state == 1) goto L1; var client = new WebClient(); var task = client.DownloadStringTaskAsync(url); $state = 1; $a1 = task.GetAwaiter(); if ($a1.BeginAwait($resume)) return; L1: var text = $a1.EndAwait(); var xml = XElement.Parse(text); $builder.SetResult(xml); } catch (Exception $ex) { $builder.SetException($ex); } }; $resume(); return $builder.Task; } Task GetRssAsync(string url) { var $builder = AsyncMethodBuilder.Create(); var $state = 0; TaskAwaiter $a1; Action $resume = delegate { try { if ($state == 1) goto L1; var client = new WebClient(); var task = client.DownloadStringTaskAsync(url); $state = 1; $a1 = task.GetAwaiter(); if ($a1.BeginAwait($resume)) return; L1: var text = $a1.EndAwait(); var xml = XElement.Parse(text); $builder.SetResult(xml); } catch (Exception $ex) { $builder.SetException($ex); } }; $resume(); return $builder.Task; }
  • Slide 33
  • As simple as synchronous code Unifies computational, network and I/O asynchrony More scalable servers More responsive UI
  • Slide 34
  • C# 1.0 Managed Code C# 2.0 Generics C# 3.0 Language Integrated Query C# 4.0 Dynamic Typing Asynchronous Programming C# v.Next
  • Slide 35
  • Class Field public Foo private string X X Compiler Source code Source File Source code.NET Assembly Meta-programmingRead-Eval-Print Loop Language Object Model DSL Embedding
  • Slide 36
  • Visual Studio Async CTP http://msdn.com/vstudio/async Eric Lipperts Blog http://blogs.msdn.com/b/ericlippert/ The Async CTP does not currently work if SP1 is installed Need to install on top of the RTM version A new CTP will probably be released soon that will work with SP1