Asynkroninen ohjelmointi.net 4.5 versiolla Jari Kallonen Software Specialist at Tieturi Oy 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) Régis Laurent Director of Operations, Global Knowledge Competencies include: Gold Learning Silver System Management
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
Async vs. Parallel Async ohjelmointi Käytettävyys/Reagointi Parallel ohjelmointi Suorituskyky GUI (desktop, web, mobile) Tiede Cloud Sosiaalinen media Windows 8 Verkko, IO tehtävät Numeroiden murskaus
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
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
Demo Pitkäkestoinen ->UI:n käytettävyys -AsianOptions
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
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)
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
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ä
Demo async /await -AsyncAwait simple
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ä
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()); } }
Taskin Odotus Task.WhenAny(), Task.WhenAll() -Ei jatketa kunnes taski tai kaikki taskit ovat lopettaneet - Linq, extension methods ja Lambda hyvänä apuna
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ä
Demo Rinnakkaisuus ja Parallel.For () -Mandelbrot
Taskin pakottaminen omaan taustasäikeeseen Taskin voi siirtää taustasäikeeseen ThreadPooliin Task.Run() metodilla
Viive Taskin suorituksessa Perinteisesti Thread.Sleep() metodilla Async koodissa Task.Delay() metodilla
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
Kiitos ja kumarrus Jari.kallonen@tieturi.fi 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.