• Like
  • Save
Async/Await: make it simple!!
Upcoming SlideShare
Loading in...5
×
 

Async/Await: make it simple!!

on

  • 1,239 views

Sessione "Async/Await: make it simple!!!" tenuta da Massimo Bonanni durante l'evento Win8@Work di DomusDotNet

Sessione "Async/Await: make it simple!!!" tenuta da Massimo Bonanni durante l'evento Win8@Work di DomusDotNet

Statistics

Views

Total Views
1,239
Views on SlideShare
1,218
Embed Views
21

Actions

Likes
4
Downloads
6
Comments
0

2 Embeds 21

http://www.domusdotnet.org 20
http://www.linkedin.com 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Async/Await: make it simple!! Async/Await: make it simple!! Presentation Transcript

    • Async/Await make it simple!! Massimo Bonanni http://codetailor.blogspot.com massimo.bonanni@domusdotnet.org @massimobonanni
    • Agenda Cos’è e cosa non è «Asincrono» L’asincrono prima di Async/Await Cosa sono Async e Await Cosa fanno Async/Await La «magia» del compilatore Async/Await ed i thread Cancellation e Progress in Async/Await Riutilizzare vecchio codice Async/Await e Windows Store Apps Async/Await e il framework 4.0
    • Cos’è «Asincrono»«Il lavoro di un cameriereconsiste nell’attendere ad untavolo finché il cliente non haterminato il pasto! Se vuoiservire due tavoli, hai bisognodi due camerieri!»«Non hai bisogno di due camerieri! Un unicocameriere può facilmente servire due tavolicontemporaneamente, semplicementepassando da uno all’altro»
    • Cosè “Asincrono”Pensiamo al cameriere come un thread, e il tavolocome un metodo da eseguire.In un approccio tradizionale, per eseguire duecompiti contemporaneamente (ad esempio,mantenere linterfaccia utente sensibile durante ildownload di un file), si sarebbero utilizzati duethread.Creare thread è inefficiente (assumere camerierinoleggio) e si deve combattere parecchio peraggiornare le UI dal thread in background (fare inmodo che i camerieri non siano in conflitto).
    • Asincrono vs Sincrono: perchè e come! asincrono [a-sìn-cro-no] agg.«dispositivo che opera senza un riferimentotemporale di sincronizzazione rispetto a unaltro dispositivo» ↓ «non [a] nello stesso tempo»
    • Cosa non è «Asincrono»Asincrono non significa «eseguito inbackground»!!Eseguire un’operazione in background èuna delle possibili implementazioni diasincrono, non l’unica e, a volte, neanche lamigliore
    • Asincrono vs Sincrono: perchè ecome!Un approccio asincrono garantisce che lenostre interfacce grafiche siano:• Responsive• Non bloccate da logiche di accesso ai dati (sia per dati locali che remoti)
    • DEMONumeri primi non «Fluid»
    • L’asincrono prima di Async/AwaitIl framework .NET, prima dell’introduzionedella TPL, prevedeva due modalità diimplementazione del pattern asincrono:• Asynchronous Programming Model (APM)• Event-based Asynchronous Pattern (EAP)
    • Asynchronous Programming ModelAPM si basa sul design patternIAsyncResult e prevede che le operazioniasincrone siano individuate da una coppia dimetodi caratterizzati dai prefissi Begin/End.Un esempio è dato dalla classe FileStreamcon i suoi metodi BeginRead e EndRead.
    • Asynchronous Programming ModelPer utilizzare questo tipo di chiamate asincronesono necessari i seguenti step: 1. il chiamante invoca il metodo Begin passando una funzione di callback; 2. l’esecuzione dell’operazione asincrona avviene in un thread separato; 3. al termine dell’operazione è richiamata la callback passata dal chiamante; 4. il chiamante conclude l’operazione asincrona invocando il metodo End (che restituisce i dati di ritorno del metodo).
    • Event-based AsynchronousPatternLe operazioni asincrone sono rappresentate da unacoppia Metodo/Evento.Il metodo è identificato dal suffisso Async mentrel’evento dal suffisso Completed.Nell’argomento dell’evento sono, generalmente,riportati i risultati dell’operazione.Un esempio presente nel framework .NET è ilmetodo DownloadStringAsync (e il corrispettivoevento DownloadStringCompleted) della classeWebClient
    • Event-based AsynchronousPatternEAP è stato introdotto con la versione 2.0 delframework .NET.I passi eseguiti dal chiamante sono:1. il chiamante si sottoscrive all’evento di completamento dell’operazione (Completed);2. il chiamante esegue il metodo Async;3. il metodo esegue l’operazione in un thread separato;4. al termine dell’operazione viene sollevato l’evento Completed e il chiamante viene avvertito del completamento.
    • DEMONumeri primi in EAP
    • Cosa sono Async/AwaitVantaggi di Async/Await:1. Permette di scrivere codice asincrono con una struttura che sembra quella di un codice sincrono;2. In caso di aggiornamenti dell’interfaccia non è necessario utilizzare un SynchronizationContext;3. La gestione delle eccezioni avviene in maniera del tutto analoga ad un codice sincrono.
    • Cosa sono Async/AwaitLa parola chiave Async indica alcompilatore che un metodo (sia essoclassico che una lamdba expression) èasicrono e che, quindi, al suo internopossono trovare posto dei punti di“sospensione” identificati dalla parolachiave Await.
    • Cosa sono Async/AwaitLa parola chiave Await indica al compilatoreche il metodo a cui fa riferimento deve essereinvocato in maniera asincrona, inserendo una“sospensione” nel flusso di esecuzione, perriprendere dal metodo successivo nel momentoin cui tale metodo asincrono è terminato.Nel frattempo, controllo viene restituito alchiamante del metodo asincrono garantendoche questo non sia bloccato.
    • Async/Await e i TaskLa classe Task è uno strumento con cuiimplementare metodi «awaitabili» (l’altro èl’interfaccia IAsyncOperation)La parola chiave Await davanti ad una funzione cheritorna un Task, ne cambia «magicamente» il valoredi ritorno (e il comportamento):
    • Async/Await e i TaskEsempio: metodo DownloadStringTaskAsyncdella classe WebClientUn metodo che restituisce un Task è definito«Awaitable» e può essere usato in manieraasincrona anteponendo Await:
    • Cosa fanno Async/AwaitMyForm Premere
    • La «magia» del compilatoreIl compilatore, grazie alle parole chiaveAsync e Await, è in grado di:• Gestire tutti i task eventualmente creati all’interno di un metodo «Awaitable»;• Gestire la macchina a stati per il corretto richiamo degli stessi.
    • La «magia» del compilatoreIl compilatore, dietro le quinte, crea unamacchina a stati i cui stati sono i possibiliflussi tra i diversi metodi «Awaitabili»richiamati.Per ogni metodo Async, viene creata unastruttura che implementa l’interfacciaIAsyncStateMachine deputata alla gestionedella macchina a stati.
    • Async/Await e i threadL’uso di Async/Await può generare o menola creazione di nuovi thread.Un metodo Async «gira» nel«synchronization context» corrente.Solo nel caso di Task.Run avremo l’effettivacreazione di un thread separato(sincronizzato dal compilatore).
    • DEMONumeri primi in Async/Await
    • Annullare l’esecuzione di un AsyncIn alcuni casi può essere necessarioannullare una operazione Async.Poiché alla base del paradigma Async/Awaitc’è il Task, possiamo ricorrere alCancellationToken per annullareun’operazione asincrona esattamente comefaremo per un Task.
    • DEMONumeri primi in Async/Await - Cancellation
    • Progress di un AsyncSe vogliamo supportare l’aggiornamentodell’interfaccia grafica, possiamo utilizzarel’interfaccia IProgress(Of T).E’ sufficiente prevedere un parametro di tipoIProgress(Of T) con T il tipo da comunicarealla UI per l’aggiornamento.
    • DEMONumeri primi in Async/Await - Progress
    • Riutilizzare vecchio codiceSe abbiamo del codice «legacy» che dobbiamorapidamente riutilizzare in ottica Async,possiamo far leva sulla classe Task: Public Function LegacyMethod(i As Integer) As Integer . . End Function Public Function LegacyMethodAsync(i As Integer) As Task(Of Integer) Dim task = Task.Run(Function() LegacyMethod(i)) Return task End Function
    • Riutilizzare vecchio codiceSe possibile è meglio ristrutturare il codice«legacy» utilizzando internamente metodi«Awaitable» forniti dal framework anzichéusare il Task a tappeto.Se si utilizza, ad esempio, il metodoDownloadString della classe WebClient, èmeglio sostituirlo con il metodoDownloadStringTaskAsync piuttosto cheincapsulare tutto il nostro metodo in un task.
    • Async/Await e Windows StoreAppsTutte le operazioni che, potenzialmente,possono durare più di 50ms, sonoasincrone!Il framework per le Windows Store Appsespone, per queste operazioni, solo edesclusivamente i metodi Async!Ragionate nello stesso modo per le vostreapplicazioni (senza esagerare)!
    • Async/Await e .NET framework 4.0Possiamo utilizzare il pattern Async/Await anche conil framework 4.0 utilizzando l’Async Targetting Pack.Il pack permette di usare Await in VS2012 con leseguenti versioni di progetto:• .NET Framework 4.0 (con KB2468871)• Silverlight 4 e 5• Windows Phone 7.5• Portable Class Libraries per le precedenti piattaforme
    • Q&ASe avete domande non fatele in asincrono..... fatele ora!!!
    • Grazie agli sponsor
    • RiferimentiAsync Targeting Pack per VS2012http://www.microsoft.com/en-us/download/details.aspx?id=29576Asynchronous Programming with Async andAwait (C# and Visual Basic)http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspxAsynchronous programming (Windows Storeapps)http://msdn.microsoft.com/en-us/library/windows/apps/hh464924.aspxBase Class Library (BCL) Bloghttp://blogs.msdn.com/b/bclteam/