21
Régis Laurent Director of Operations, Global Knowledge Competencies include: Gold Learning Silver System Management Asynkroninen ohjelmointi .NET 4.5 versiolla Jari Kallonen Software Specialist at Tieturi Oy

TechDays 2013 Jari Kallonen: Asynchronous Programming .NET 4.5

Embed Size (px)

Citation preview

Page 1: TechDays 2013 Jari Kallonen: Asynchronous Programming .NET 4.5

Régis Laurent Director of Operations, Global Knowledge Competencies include: Gold Learning Silver System Management

Asynkroninen ohjelmointi .NET 4.5 versiolla

Jari Kallonen Software Specialist at Tieturi Oy

Page 2: TechDays 2013 Jari Kallonen: Asynchronous Programming .NET 4.5

Régis Laurent Director of Operations, Global Knowledge Competencies include: Gold Learning Silver System Management

- Asynkroninen ohjelmointi yleistä - Asynkroninen ohjelmointi C# 5/.NET 4.5 ympäristössä - Parannukset Task Parallel Libraryssa (TPL)

Page 3: TechDays 2013 Jari Kallonen: Asynchronous Programming .NET 4.5

Mitä on asynkroninen koodi?

Koodia jota suoritetaan samanaikaisesti kuten muuta koodia Käytännössä siis koodi jota suoritetaan callback toiminossa (ThreadPool) tai säikeessä (Thread) ja tekee esimerkiksi käyttöliittymästä käytettävämmän ilman “tiimalasia”

Page 4: TechDays 2013 Jari Kallonen: Asynchronous Programming .NET 4.5

Async vs. Parallel

Async ohjelmointi Käytettävyys/Reagointi

GUI (desktop, web, mobile)

Cloud

Windows 8

Parallel ohjelmointi Suorituskyky

Tiede

Sosiaalinen media

Verkko, IO tehtävät

Numeroiden murskaus

Page 5: TechDays 2013 Jari Kallonen: Asynchronous Programming .NET 4.5

Uusien Async toimintojen käyttö

Visula Studio 2012 ja .NET 4.5 kautta suoraan käytettävissä Visual Studio 2010 ja .NET 4 ympäristöön voi asentaa Visual Studio Async CTP laajennoksen Useat System.IO nimiavaruudessa olevat luokat kuten Stream, TextWriter ja TextReader sisältävät async metodit System.Data.Common /System.Data.SqlClient nimiavaruuksissa olevat useat luokat WCF proxy sisältää oletuksena myös async metodit

Page 6: TechDays 2013 Jari Kallonen: Asynchronous Programming .NET 4.5

Ei näin

Kaikki toiminnot (palvelupyynnöt jne.) suoritetaan UI säikeessä, joka tuo sen tutun tiimalasin eli käyttöliittymä on lukossa kunnes operaatio on suoritettu

Page 7: TechDays 2013 Jari Kallonen: Asynchronous Programming .NET 4.5

Demo

Pitkäkestoinen ->UI:n käytettävyys -AsianOptions

Page 8: TechDays 2013 Jari Kallonen: Asynchronous Programming .NET 4.5

Aikaisempi tapa

Ennen .NET 4.5 asynkroninen koodi toteutettiin esim. IAsyncResult mallilla (async delegaatti) Begin/End metodeilla Tapahtumapohjaisesti event mallilla Ei välttämättä selkeää koska suoritus jakautui useamman metodin toiminnallisuuteen Oma hankaluutensa poikkeuksien käsittelyyn, koska eivät kupli pääsäikeen poikkeuskäsittelyyn

Page 9: TechDays 2013 Jari Kallonen: Asynchronous Programming .NET 4.5

Uusi .NET 4.5 tapa

async ja await avainsanat async kertoo kääntäjälle että metodi sisältää asynkronista toimintoa, käytännössä metodi myös sisältää await avainsanan – public async void MyMethodAsync() {} Siinä se mitä async tekee mutta se ei tee vielä metodista asynkronista Käytä await avainsanaa kutsuessasi async metodia joka palauttaa Task:n – string name = await MyMethodAsync(); Kutsuttu metodi palautuu kutsuvalle säikeelle (palataan tähän myöhemmin)

Page 10: TechDays 2013 Jari Kallonen: Asynchronous Programming .NET 4.5

Task

Task “Tehtävä” esiteltiin 4.0 versiossa ja löytyvät System.Threading.Tasks nimiavaruudesta Task kuvaa tehtävää joka suoritetaan kokonaisuudessa asynkronisesti Taskia voidaan odottaa, peruuttaa, raportoida sen tilaa ja se voi palauttaa arvon. Taskia käytetään Task Parallel Libraryn (TPL) kanssa NET 4.5 toiminnallisuutta on paranneltu

Page 11: TechDays 2013 Jari Kallonen: Asynchronous Programming .NET 4.5

Luokkakirjaston nimeämiskäytännöt

Asynkroniset metodit päättyvät Async sanaan -StreamWriter.ReadToEndAsync(); - WebClient.DownloadDataTaskAsync(); Useat IO-, verkko-luokat ym. Sisältävät tuen oheisen nimeämiskäytännön mukaan [Task]Async jälkiliitteellä

Page 12: TechDays 2013 Jari Kallonen: Asynchronous Programming .NET 4.5

Demo

async /await -AsyncAwait simple

Page 13: TechDays 2013 Jari Kallonen: Asynchronous Programming .NET 4.5

Poikkeuskäsittely

Automaattisesti kuplii kutsujaan, mikä ei aikasemmissa asynkronisissa näin mennyt Yksinkertaistaa poikkeusten käsittelyä, ei muuta kuin kutsu try-catch lohkoon ja siinä se Käisttelee synkronisen ja asynkronisen suorituksen poikkeukset samassa käsittelijässä

Page 14: TechDays 2013 Jari Kallonen: Asynchronous Programming .NET 4.5

Sync vs. Async poikkeuskäsittely

void Foo(){ try { Console.WriteLine("Synchronic");; ThreadPool.QueueUserWorkItem(state => { try { Console.WriteLine("Parallel"); } catch (Exception exAsync) { EventLog.WriteEntry("application", exAsync.ToString()); } }, null); } catch (Exception ex) { EventLog.WriteEntry("application", ex.ToString()); } }

async void Foo(){ try { Console.WriteLine("Synchronic"); await Task.Factory.StartNew(() => Console.WriteLine("Parallel")); } catch (Exception ex) { // handling both synchronic and parallel exceptions EventLog.WriteEntry("application", ex.ToString()); } }

Page 15: TechDays 2013 Jari Kallonen: Asynchronous Programming .NET 4.5

Taskin Odotus

Task.WhenAny(), Task.WhenAll() -Ei jatketa kunnes taski tai kaikki taskit ovat lopettaneet - Linq, extension methods ja Lambda hyvänä apuna

Page 16: TechDays 2013 Jari Kallonen: Asynchronous Programming .NET 4.5

Rinnakkaisuus

Parallel.For(), Parallel.ForEach() Ovat osa TPL kirjastoa versiosta 4.0 lähtien Mahdollistaa listojen läpikäymisen samanaikaisesti eri ytimissä OK, mikäli eivät käsittele UI säiettä

Page 17: TechDays 2013 Jari Kallonen: Asynchronous Programming .NET 4.5

Demo

Rinnakkaisuus ja Parallel.For () -Mandelbrot

Page 18: TechDays 2013 Jari Kallonen: Asynchronous Programming .NET 4.5

Taskin pakottaminen omaan taustasäikeeseen

Taskin voi siirtää taustasäikeeseen “ThreadPooliin” Task.Run() metodilla

Page 19: TechDays 2013 Jari Kallonen: Asynchronous Programming .NET 4.5

Viive Taskin suorituksessa

Perinteisesti Thread.Sleep() metodilla Async koodissa Task.Delay() metodilla

Page 20: TechDays 2013 Jari Kallonen: Asynchronous Programming .NET 4.5

Yhteenveto

Asynkroninen ohjelmointi .NET 4.5 versiolla yksinkertaistaa asynkronisen koodin toteutusta ja poikkeusten käsittelyä .NET 4.5 sisältää valmiiksi tähän malliin toteutetut metodit useissa luokissa Edelleen normaalisti käytössä ThreadPool ja Thread käsittely Valmiina Visual Studio 2012 / .NET 4.5 versiossa, sekä saatavana Visual Studio 2010/.NET 4 ympäristöön Visual Studio Async CTP:n kautta

Page 21: TechDays 2013 Jari Kallonen: Asynchronous Programming .NET 4.5

© 2012 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 presentations. 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.

Kiitos ja kumarrus [email protected]