Presentation is loading. Please wait.

Presentation is loading. Please wait.

Asynchronous Programming in .NET

Similar presentations


Presentation on theme: "Asynchronous Programming in .NET"— Presentation transcript:

1 Asynchronous Programming in .NET
Mads Torgersen C# Language PM Microsoft

2 C# Evolution Asynchrony Dynamic LINQ Generics Managed Code C# 5.0

3 The Future is the Future
Asynchrony is becoming the norm Responsiveness Scalability Futures: Modern abstractions .NET Tasks JS Promises WinRT Async Operations

4 Futures and Promises Tasks
Objects that separate initiation of activities from consumption of their outcome Tasks

5 Synchronous vs. Asynchronous
var data = DownloadData(...); ProcessData(data); STOP DownloadData ProcessData var future = DownloadDataAsync(...); future.ContinueWith(data => ProcessData(data)); DownloadDataAsync ProcessData

6 Synchronous vs. Asynchronous
var data = DownloadData(...); ProcessData(data); STOP STOP DownloadData ProcessData var future = DownloadDataAsync(...); future.ContinueWith(data => ProcessData(data)); DownloadDataAsync ProcessData

7 Asynchronous Responsive UI
11/21/2018 1:11 AM Asynchronous Responsive UI demo © 2007 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries. The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.

8 Unifying Asynchrony Asynchronous Methods Task CPU Network I/O
Composite

9 How Does it Work? async Task<XElement> GetRssAsync(string url) {
var client = new WebClient(); var task = client.DownloadStringTaskAsync(url); var text = await task; var xml = XElement.Parse(text); return xml; }

10 How Does it Work? (Sort of)
async Task<XElement> GetRssAsync(string url) { var client = new WebClient(); var task = client.DownloadStringTaskAsync(url); return task.ContinueWith(t => { var text = t.Result; var xml = XElement.Parse(text); return xml; }); }

11 How Does it Work? (Really)
async Task<XElement> GetRssAsync(string url) { var client = new WebClient(); var task = client.DownloadStringTaskAsync(url); var text = await task; var xml = XElement.Parse(text); return xml; }

12 How Does it Work? (Really)
Task<XElement> GetRssAsync(string url) { var $builder = AsyncTaskMethodBuilder<XElement>.Create(); var $state = 0; TaskAwaiter<string> $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.IsCompleted) return; $a1.OnCompleted($resume); L1: var text = $a1.GetResult(); var xml = XElement.Parse(text); $builder.SetResult(xml); } catch (Exception $ex) { $builder.SetException($ex); } }; $resume(); return $builder.Task; async Task<XElement> GetRssAsync(string url) { var client = new WebClient(); var task = client.DownloadStringTaskAsync(url); var text = await task; var xml = XElement.Parse(text); return xml; }

13 Asynchronous Methods No more callbacks!

14 © 2011 Microsoft Corporation. All rights reserved
© 2011 Microsoft Corporation. All rights reserved. Microsoft, Visual Studio, the Visual Studio logo, and [list other trademarks referenced] are trademarks of the Microsoft group of companies. The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation.  Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation.  MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED, OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.

15 Asynchronous Control Flow
async void DoWorkAsync() { var t1 = ProcessFeedAsync(" var t2 = ProcessFeedAsync(" 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); } Message Pump UI Thread

16 Asynchronous Control Flow
async void DoWorkAsync() { var t1 = ProcessFeedAsync(" var t2 = ProcessFeedAsync(" 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); }

17 Asynchronous Control Flow
async void DoWorkAsync() { var t1 = ProcessFeedAsync(" var t2 = ProcessFeedAsync(" 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); }

18 Asynchronous Control Flow
async void DoWorkAsync() { var t1 = ProcessFeedAsync(" var t2 = ProcessFeedAsync(" 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); }

19 Asynchronous Control Flow
async void DoWorkAsync() { var t1 = ProcessFeedAsync(" var t2 = ProcessFeedAsync(" 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); } t1

20 Asynchronous Control Flow
async void DoWorkAsync() { var t1 = ProcessFeedAsync(" var t2 = ProcessFeedAsync(" 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); } t1 t2

21 Asynchronous Control Flow
async void DoWorkAsync() { var t1 = ProcessFeedAsync(" var t2 = ProcessFeedAsync(" 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); } t1 t2

22 Asynchronous Control Flow
async void DoWorkAsync() { var t1 = ProcessFeedAsync(" var t2 = ProcessFeedAsync(" 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); } t1 t2

23 Asynchronous Control Flow
async void DoWorkAsync() { var t1 = ProcessFeedAsync(" var t2 = ProcessFeedAsync(" 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); } t1 t2

24 Asynchronous Control Flow
async void DoWorkAsync() { var t1 = ProcessFeedAsync(" var t2 = ProcessFeedAsync(" 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); } t1 t2

25 Asynchronous Control Flow
async void DoWorkAsync() { var t1 = ProcessFeedAsync(" var t2 = ProcessFeedAsync(" 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); } t1 t2

26 Asynchronous Control Flow
async void DoWorkAsync() { var t1 = ProcessFeedAsync(" var t2 = ProcessFeedAsync(" 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); } t1 t2

27 Asynchronous Control Flow
async void DoWorkAsync() { var t1 = ProcessFeedAsync(" var t2 = ProcessFeedAsync(" 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); } t1 t2

28 Asynchronous Control Flow
async void DoWorkAsync() { var t1 = ProcessFeedAsync(" var t2 = ProcessFeedAsync(" 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); } t1 t2

29 Asynchronous Control Flow
async void DoWorkAsync() { var t1 = ProcessFeedAsync(" var t2 = ProcessFeedAsync(" 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); } t1 t2

30 Asynchronous Control Flow
async void DoWorkAsync() { var t1 = ProcessFeedAsync(" var t2 = ProcessFeedAsync(" 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); } t1 t2

31 Asynchronous Control Flow
async void DoWorkAsync() { var t1 = ProcessFeedAsync(" var t2 = ProcessFeedAsync(" 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); } t1 t2

32 How Does it Work? async Task<XElement> GetRssAsync(string url) {
var $builder = AsyncTaskMethodBuilder<XElement>.Create(); var $state = 0; TaskAwaiter<string> $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.IsCompleted) return; $a1.OnCompleted($resume); L1: var text = $a1.GetResult(); var xml = XElement.Parse(text); $builder.SetResult(xml); } catch (Exception $ex) { $builder.SetException($ex); } }; $resume(); return $builder.Task; async Task<XElement> GetRssAsync(string url) { var client = new WebClient(); var task = client.DownloadStringTaskAsync(url); var text = await task; var xml = XElement.Parse(text); return xml; }

33 How Does it Work? async Task<XElement> GetRssAsync(string url) {
var $builder = AsyncTaskMethodBuilder<XElement>.Create(); var $state = 0; TaskAwaiter<string> $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.IsCompleted) return; $a1.OnCompleted($resume); L1: var text = $a1.GetResult(); var xml = XElement.Parse(text); $builder.SetResult(xml); } catch (Exception $ex) { $builder.SetException($ex); } }; $resume(); return $builder.Task; async Task<XElement> GetRssAsync(string url) { var client = new WebClient(); var task = client.DownloadStringTaskAsync(url); var text = await task; var xml = XElement.Parse(text); return xml; }

34 How Does it Work? async Task<XElement> GetRssAsync(string url) {
var $builder = AsyncTaskMethodBuilder<XElement>.Create(); var $state = 0; TaskAwaiter<string> $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.IsCompleted) return; $a1.OnCompleted($resume); L1: var text = $a1.GetResult(); var xml = XElement.Parse(text); $builder.SetResult(xml); } catch (Exception $ex) { $builder.SetException($ex); } }; $resume(); return $builder.Task; async Task<XElement> GetRssAsync(string url) { var client = new WebClient(); var task = client.DownloadStringTaskAsync(url); var text = await task; var xml = XElement.Parse(text); return xml; }

35 How Does it Work? async Task<XElement> GetRssAsync(string url) {
var $builder = AsyncTaskMethodBuilder<XElement>.Create(); var $state = 0; TaskAwaiter<string> $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.IsCompleted) return; $a1.OnCompleted($resume); L1: var text = $a1.GetResult(); var xml = XElement.Parse(text); $builder.SetResult(xml); } catch (Exception $ex) { $builder.SetException($ex); } }; $resume(); return $builder.Task; async Task<XElement> GetRssAsync(string url) { var client = new WebClient(); var task = client.DownloadStringTaskAsync(url); var text = await task; var xml = XElement.Parse(text); return xml; }

36 How Does it Work? async Task<XElement> GetRssAsync(string url) {
var $builder = AsyncTaskMethodBuilder<XElement>.Create(); var $state = 0; TaskAwaiter<string> $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.IsCompleted) return; $a1.OnCompleted($resume); L1: var text = $a1.GetResult(); var xml = XElement.Parse(text); $builder.SetResult(xml); } catch (Exception $ex) { $builder.SetException($ex); } }; $resume(); return $builder.Task; async Task<XElement> GetRssAsync(string url) { var client = new WebClient(); var task = client.DownloadStringTaskAsync(url); var text = await task; var xml = XElement.Parse(text); return xml; }

37 How Does it Work? async Task<XElement> GetRssAsync(string url) {
var $builder = AsyncTaskMethodBuilder<XElement>.Create(); var $state = 0; TaskAwaiter<string> $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.IsCompleted) return; $a1.OnCompleted($resume); L1: var text = $a1.GetResult(); var xml = XElement.Parse(text); $builder.SetResult(xml); } catch (Exception $ex) { $builder.SetException($ex); } }; $resume(); return $builder.Task; async Task<XElement> GetRssAsync(string url) { var client = new WebClient(); var task = client.DownloadStringTaskAsync(url); var text = await task; var xml = XElement.Parse(text); return xml; }

38 How Does it Work? async Task<XElement> GetRssAsync(string url) {
var $builder = AsyncTaskMethodBuilder<XElement>.Create(); var $state = 0; TaskAwaiter<string> $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.IsCompleted) return; $a1.OnCompleted($resume); L1: var text = $a1.GetResult(); var xml = XElement.Parse(text); $builder.SetResult(xml); } catch (Exception $ex) { $builder.SetException($ex); } }; $resume(); return $builder.Task; async Task<XElement> GetRssAsync(string url) { var client = new WebClient(); var task = client.DownloadStringTaskAsync(url); var text = await task; var xml = XElement.Parse(text); return xml; }

39 How Does it Work? async Task<XElement> GetRssAsync(string url) {
var $builder = AsyncTaskMethodBuilder<XElement>.Create(); var $state = 0; TaskAwaiter<string> $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.IsCompleted) return; $a1.OnCompleted($resume); L1: var text = $a1.GetResult(); var xml = XElement.Parse(text); $builder.SetResult(xml); } catch (Exception $ex) { $builder.SetException($ex); } }; $resume(); return $builder.Task; async Task<XElement> GetRssAsync(string url) { var client = new WebClient(); var task = client.DownloadStringTaskAsync(url); var text = await task; var xml = XElement.Parse(text); return xml; }

40 How Does it Work? async Task<XElement> GetRssAsync(string url) {
var $builder = AsyncTaskMethodBuilder<XElement>.Create(); var $state = 0; TaskAwaiter<string> $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.IsCompleted) return; $a1.OnCompleted($resume); L1: var text = $a1.GetResult(); var xml = XElement.Parse(text); $builder.SetResult(xml); } catch (Exception $ex) { $builder.SetException($ex); } }; $resume(); return $builder.Task; async Task<XElement> GetRssAsync(string url) { var client = new WebClient(); var task = client.DownloadStringTaskAsync(url); var text = await task; var xml = XElement.Parse(text); return xml; }

41 How Does it Work? async Task<XElement> GetRssAsync(string url) {
var $builder = AsyncTaskMethodBuilder<XElement>.Create(); var $state = 0; TaskAwaiter<string> $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.IsCompleted) return; $a1.OnCompleted($resume); L1: var text = $a1.GetResult(); var xml = XElement.Parse(text); $builder.SetResult(xml); } catch (Exception $ex) { $builder.SetException($ex); } }; $resume(); return $builder.Task; async Task<XElement> GetRssAsync(string url) { var client = new WebClient(); var task = client.DownloadStringTaskAsync(url); var text = await task; var xml = XElement.Parse(text); return xml; }

42 Awaiting a Task public class Task<TResult> : Task { ...
{ ...     public TaskAwaiter<TResult> GetAwaiter(); } public struct TaskAwaiter<TResult> { public bool IsCompleted { get; } public void OnCompleted(Action a);     public TResult GetResult();

43 Awaiting a Task public class Task<TResult> : Task { ...
{ ...     public TaskAwaiter<TResult> GetAwaiter(); } public struct TaskAwaiter<TResult> { public bool IsCompleted { get; } public void OnCompleted(Action a) var sc = SynchronizationContext.Current; task.ContinueWith(_ => sc.Post(a));     public TResult GetResult();


Download ppt "Asynchronous Programming in .NET"

Similar presentations


Ads by Google