Upload
tieturi-oy
View
250
Download
2
Embed Size (px)
Citation preview
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
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)
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
GUI (desktop, web, mobile)
Cloud
Windows 8
Parallel ohjelmointi Suorituskyky
Tiede
Sosiaalinen media
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
© 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]