Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Async mit C# 5

Async mit C# 5

C# 5 bietet für die asynchrone Programmierung neue Keywords wie async und await. Die älteren async-Patterns sind Vergangenheit. Mit den neuen Keywords wird die asynchrone Programmierung viel einfacher. Diese Session zeigt, wie die neuen Keywords genutzt werden können, welche Features man damit bekommt, wie man selbst solche asynchronen Methoden erstellen kann und was hinter diesen Keywords steckt.

Christian Nagel

February 27, 2013
Tweet

More Decks by Christian Nagel

Other Decks in Programming

Transcript

  1. Christian Nagel • Microsoft Regional Director • Microsoft MVP •

    Consulting & Training http://www.cninnovation.com http://www.thinktecture.com http://weblogs.thinktecture.com/cnagel XING – LinkedIn – Twitter – Google+
  2. Async Patterns Async Pattern • .NET 1.0 Event- based Async

    Pattern • .NET 2.0 Task- based Async Pattern • .NET 4.5
  3. What we've seen • Async Pattern – Begin / End

    Methoden – Komplex zu verwenden • Async Event Pattern – Callback Handler im Thread mit Synchronization-Context – Einfacher aber falsche Reihenfolge • async / await Keywords – Programmierstil wie synchrone Programmierung
  4. What we've seen Async / Await – basiert auf Continuation

    Tasks – Neue Keywords sind einfacher
  5. What we've seen • void Methoden vermeiden • Fehler beim

    wartenden Aufrufer • Bei Composition: – Exception Information vom 1. Task – Resulting Task beinhaltet AggregateException
  6. What we've seen • Standard Cancellation Mechanismus seit .NET 4

    • CancellationTokenSource • Übergabe vom Cancellation Token an die asynchrone Methode • OperationCanceledException
  7. Summary • UI Thread nicht blockieren • async / await

    ist einfach zu verwenden • Async Implementierungen im .NET Framework
  8. Call to Action • Start using Visual Studio 2012, C#

    5 und .NET 4.5 • Async mit allen Applikations-Typen • Async und Windows Store apps • 101 Async Samples
  9. Sync - WebClient private void OnSearchSync(object sender, RoutedEventArgs e) {

    foreach (var req in GetSearchRequests()) { WebClient client = new WebClient(); client.Credentials = req.Credentials; string resp = client.DownloadString(req.Url); IEnumerable<SearchItemResult> images = req.Parse(resp); foreach (var image in images) { searchInfo.List.Add(image); } } }
  10. Async Pattern private void OnSeachAsyncPattern(object sender, RoutedEventArgs e) { Func<string,

    ICredentials, string> downloadString = (address, cred) => { var client = new WebClient(); client.Credentials = cred; return client.DownloadString(address); }; Action<SearchItemResult> addItem = item => searchInfo.List.Add(item); foreach (var req in GetSearchRequests()) { downloadString.BeginInvoke(req.Url, req.Credentials, ar => { string resp = downloadString.EndInvoke(ar); var images = req.Parse(resp); foreach (var image in images) { this.Dispatcher.Invoke(addItem, image); } }, null); } }
  11. Async Event Pattern private void OnAsyncEventPattern(object sender, RoutedEventArgs e) {

    foreach (var req in GetSearchRequests()) { var client = new WebClient(); client.Credentials = req.Credentials; client.DownloadStringCompleted += (sender1, e1) => { string resp = e1.Result; var images = req.Parse(resp); foreach (var image in images) { searchInfo.List.Add(image); } }; client.DownloadStringAsync(new Uri(req.Url)); } }
  12. Task-Based Async Pattern private async void OnTaskBasedAsyncPattern1(object sender, RoutedEventArgs e)

    { foreach (var req in GetSearchRequests()) { var client = new WebClient(); client.Credentials = req.Credentials; string resp = await client.DownloadStringTaskAsync(req.Url); var images = req.Parse(resp); foreach (var image in images) { searchInfo.List.Add(image); } } }