SlideShare uma empresa Scribd logo
1 de 35
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 cameriere
consiste nell’attendere ad un
tavolo finché il cliente non ha
terminato il pasto! Se vuoi
servire due tavoli, hai bisogno
di due camerieri!»
«Non hai bisogno di due camerieri! Un unico
cameriere può facilmente servire due tavoli
contemporaneamente, semplicemente
passando da uno all’altro»
Cosè “Asincrono”

Pensiamo al cameriere come un thread, e il tavolo
come un metodo da eseguire.

In un approccio tradizionale, per eseguire due
compiti contemporaneamente (ad esempio,
mantenere l'interfaccia utente sensibile durante il
download di un file), si sarebbero utilizzati due
thread.

Creare thread è inefficiente (assumere camerieri
noleggio) e si deve combattere parecchio per
aggiornare le UI dal thread in background (fare in
modo 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 riferimento
temporale di sincronizzazione rispetto a un
altro dispositivo»
                        ↓
         «non [a] nello stesso tempo»
Cosa non è «Asincrono»


Asincrono non significa «eseguito in
background»!!

Eseguire un’operazione in background è
una delle possibili implementazioni di
asincrono, non l’unica e, a volte, neanche la
migliore
Asincrono vs Sincrono: perchè e
come!

Un approccio asincrono garantisce che le
nostre interfacce grafiche siano:

• Responsive
• Non bloccate da logiche di accesso ai dati
  (sia per dati locali che remoti)
DEMO

Numeri primi non «Fluid»
L’asincrono prima di Async/Await


Il framework .NET, prima dell’introduzione
della TPL, prevedeva due modalità di
implementazione del pattern asincrono:

• Asynchronous Programming Model
  (APM)
• Event-based Asynchronous Pattern
  (EAP)
Asynchronous Programming Model


APM si basa sul design pattern
IAsyncResult e prevede che le operazioni
asincrone siano individuate da una coppia di
metodi caratterizzati dai prefissi Begin/End.

Un esempio è dato dalla classe FileStream
con i suoi metodi BeginRead e EndRead.
Asynchronous Programming Model

Per utilizzare questo tipo di chiamate asincrone
sono 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 Asynchronous
Pattern

Le operazioni asincrone sono rappresentate da una
coppia Metodo/Evento.
Il metodo è identificato dal suffisso Async mentre
l’evento dal suffisso Completed.

Nell’argomento dell’evento sono, generalmente,
riportati i risultati dell’operazione.

Un esempio presente nel framework .NET è il
metodo DownloadStringAsync (e il corrispettivo
evento DownloadStringCompleted) della classe
WebClient
Event-based Asynchronous
Pattern

EAP è stato introdotto con la versione 2.0 del
framework .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.
DEMO

Numeri primi in EAP
Cosa sono Async/Await

Vantaggi 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/Await


La parola chiave Async indica al
compilatore che un metodo (sia esso
classico che una lamdba expression) è
asicrono e che, quindi, al suo interno
possono trovare posto dei punti di
“sospensione” identificati dalla parola
chiave Await.
Cosa sono Async/Await


La parola chiave Await indica al compilatore
che il metodo a cui fa riferimento deve essere
invocato in maniera asincrona, inserendo una
“sospensione” nel flusso di esecuzione, per
riprendere dal metodo successivo nel momento
in cui tale metodo asincrono è terminato.
Nel frattempo, controllo viene restituito al
chiamante del metodo asincrono garantendo
che questo non sia bloccato.
Async/Await e i Task

La classe Task è uno strumento con cui
implementare metodi «awaitabili» (l’altro è
l’interfaccia IAsyncOperation)
La parola chiave Await davanti ad una funzione che
ritorna un Task, ne cambia «magicamente» il valore
di ritorno (e il comportamento):
Async/Await e i Task

Esempio: metodo DownloadStringTaskAsync
della classe WebClient



Un metodo che restituisce un Task è definito
«Awaitable» e può essere usato in maniera
asincrona anteponendo Await:
Cosa fanno Async/Await

MyForm




         Premere
La «magia» del compilatore


Il compilatore, grazie alle parole chiave
Async 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 compilatore


Il compilatore, dietro le quinte, crea una
macchina a stati i cui stati sono i possibili
flussi tra i diversi metodi «Awaitabili»
richiamati.

Per ogni metodo Async, viene creata una
struttura che implementa l’interfaccia
IAsyncStateMachine deputata alla gestione
della macchina a stati.
Async/Await e i thread

L’uso di Async/Await può generare o meno
la creazione di nuovi thread.

Un metodo Async «gira» nel
«synchronization context» corrente.

Solo nel caso di Task.Run avremo l’effettiva
creazione di un thread separato
(sincronizzato dal compilatore).
DEMO

Numeri primi in Async/Await
Annullare l’esecuzione di un Async


In alcuni casi può essere necessario
annullare una operazione Async.

Poiché alla base del paradigma Async/Await
c’è il Task, possiamo ricorrere al
CancellationToken per annullare
un’operazione asincrona esattamente come
faremo per un Task.
DEMO

Numeri primi in Async/Await - Cancellation
Progress di un Async


Se vogliamo supportare l’aggiornamento
dell’interfaccia grafica, possiamo utilizzare
l’interfaccia IProgress(Of T).

E’ sufficiente prevedere un parametro di tipo
IProgress(Of T) con T il tipo da comunicare
alla UI per l’aggiornamento.
DEMO

Numeri primi in Async/Await - Progress
Riutilizzare vecchio codice

Se abbiamo del codice «legacy» che dobbiamo
rapidamente 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 codice

Se 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 metodo
DownloadString della classe WebClient, è
meglio sostituirlo con il metodo
DownloadStringTaskAsync piuttosto che
incapsulare tutto il nostro metodo in un task.
Async/Await e Windows Store
Apps

Tutte le operazioni che, potenzialmente,
possono durare più di 50ms, sono
asincrone!

Il framework per le Windows Store Apps
espone, per queste operazioni, solo ed
esclusivamente i metodi Async!

Ragionate nello stesso modo per le vostre
applicazioni (senza esagerare)!
Async/Await e .NET framework 4.0

Possiamo utilizzare il pattern Async/Await anche con
il framework 4.0 utilizzando l’Async Targetting Pack.

Il pack permette di usare Await in VS2012 con le
seguenti 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&A


Se avete domande non fatele in asincrono
..... fatele ora!!!
Grazie agli sponsor
Riferimenti

Async Targeting Pack per VS2012
http://www.microsoft.com/en-us/download/details.aspx?id=29576

Asynchronous Programming with Async and
Await (C# and Visual Basic)
http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx

Asynchronous programming (Windows Store
apps)
http://msdn.microsoft.com/en-
us/library/windows/apps/hh464924.aspx

Base Class Library (BCL) Blog
http://blogs.msdn.com/b/bclteam/

Mais conteúdo relacionado

Mais procurados

Javascript task automation
Javascript task automationJavascript task automation
Javascript task automationDotNetCampus
 
Del furia signalr-to-the-max
Del furia   signalr-to-the-maxDel furia   signalr-to-the-max
Del furia signalr-to-the-maxDotNetCampus
 
ASP.NET MVC: sfruttare la piattaforma al 100%
ASP.NET MVC: sfruttare la piattaforma al 100%ASP.NET MVC: sfruttare la piattaforma al 100%
ASP.NET MVC: sfruttare la piattaforma al 100%DomusDotNet
 
Dependency injection questa sconosciuta
Dependency injection questa sconosciutaDependency injection questa sconosciuta
Dependency injection questa sconosciutaAndrea Dottor
 
Managed Extensibility Framework (MEF)
Managed Extensibility Framework (MEF)Managed Extensibility Framework (MEF)
Managed Extensibility Framework (MEF)Manuel Scapolan
 
Javascript task automation
Javascript task automationJavascript task automation
Javascript task automationAntonio Liccardi
 
Dot netcampus2015 green-template
Dot netcampus2015 green-templateDot netcampus2015 green-template
Dot netcampus2015 green-templateDotNetCampus
 
Slide typescript - net campus
Slide typescript - net campusSlide typescript - net campus
Slide typescript - net campusDotNetCampus
 
Async: scalabilità e responsiveness senza pari! @ CDays
Async: scalabilità e responsiveness senza pari! @ CDaysAsync: scalabilità e responsiveness senza pari! @ CDays
Async: scalabilità e responsiveness senza pari! @ CDaysMatteo Baglini
 
70-485: ADVANCED OF DEVELOPING WINDOWS STORE APPS USING C#
70-485: ADVANCED OF DEVELOPING WINDOWS STORE APPS USING C#70-485: ADVANCED OF DEVELOPING WINDOWS STORE APPS USING C#
70-485: ADVANCED OF DEVELOPING WINDOWS STORE APPS USING C#DotNetCampus
 
Introduzione a Service Fabric e Actor Model
Introduzione a Service Fabric e Actor ModelIntroduzione a Service Fabric e Actor Model
Introduzione a Service Fabric e Actor ModelAndrea Tosato
 
[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...
[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...
[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...Andrea Balducci
 
Windows azure - abbattere tempi e costi di sviluppo
Windows azure - abbattere tempi e costi di sviluppoWindows azure - abbattere tempi e costi di sviluppo
Windows azure - abbattere tempi e costi di sviluppoAndrea Dottor
 
ASP.NET MVC 6 - uno sguardo al futuro
ASP.NET MVC 6 - uno sguardo al futuroASP.NET MVC 6 - uno sguardo al futuro
ASP.NET MVC 6 - uno sguardo al futuroAndrea Dottor
 
APPSTUDIO: DA ZERO ALLO STORE IN 50 MINUTI!
APPSTUDIO: DA ZERO ALLO STORE IN 50 MINUTI!APPSTUDIO: DA ZERO ALLO STORE IN 50 MINUTI!
APPSTUDIO: DA ZERO ALLO STORE IN 50 MINUTI!DotNetCampus
 
Alla scoperta di gRPC
Alla scoperta di gRPCAlla scoperta di gRPC
Alla scoperta di gRPCAndrea Dottor
 
Programmazione funzionale: un primo approccio attraverso F#
Programmazione funzionale: un primo approccio attraverso F#Programmazione funzionale: un primo approccio attraverso F#
Programmazione funzionale: un primo approccio attraverso F#Commit University
 

Mais procurados (20)

Javascript task automation
Javascript task automationJavascript task automation
Javascript task automation
 
Del furia signalr-to-the-max
Del furia   signalr-to-the-maxDel furia   signalr-to-the-max
Del furia signalr-to-the-max
 
ASP.NET MVC: sfruttare la piattaforma al 100%
ASP.NET MVC: sfruttare la piattaforma al 100%ASP.NET MVC: sfruttare la piattaforma al 100%
ASP.NET MVC: sfruttare la piattaforma al 100%
 
Dependency injection questa sconosciuta
Dependency injection questa sconosciutaDependency injection questa sconosciuta
Dependency injection questa sconosciuta
 
Managed Extensibility Framework (MEF)
Managed Extensibility Framework (MEF)Managed Extensibility Framework (MEF)
Managed Extensibility Framework (MEF)
 
Javascript task automation
Javascript task automationJavascript task automation
Javascript task automation
 
Wcf data services
Wcf data servicesWcf data services
Wcf data services
 
Dot netcampus2015 green-template
Dot netcampus2015 green-templateDot netcampus2015 green-template
Dot netcampus2015 green-template
 
jQuery
jQueryjQuery
jQuery
 
Slide typescript - net campus
Slide typescript - net campusSlide typescript - net campus
Slide typescript - net campus
 
Async: scalabilità e responsiveness senza pari! @ CDays
Async: scalabilità e responsiveness senza pari! @ CDaysAsync: scalabilità e responsiveness senza pari! @ CDays
Async: scalabilità e responsiveness senza pari! @ CDays
 
70-485: ADVANCED OF DEVELOPING WINDOWS STORE APPS USING C#
70-485: ADVANCED OF DEVELOPING WINDOWS STORE APPS USING C#70-485: ADVANCED OF DEVELOPING WINDOWS STORE APPS USING C#
70-485: ADVANCED OF DEVELOPING WINDOWS STORE APPS USING C#
 
Introduzione a Service Fabric e Actor Model
Introduzione a Service Fabric e Actor ModelIntroduzione a Service Fabric e Actor Model
Introduzione a Service Fabric e Actor Model
 
Akka.net & Actor Model
Akka.net & Actor ModelAkka.net & Actor Model
Akka.net & Actor Model
 
[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...
[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...
[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...
 
Windows azure - abbattere tempi e costi di sviluppo
Windows azure - abbattere tempi e costi di sviluppoWindows azure - abbattere tempi e costi di sviluppo
Windows azure - abbattere tempi e costi di sviluppo
 
ASP.NET MVC 6 - uno sguardo al futuro
ASP.NET MVC 6 - uno sguardo al futuroASP.NET MVC 6 - uno sguardo al futuro
ASP.NET MVC 6 - uno sguardo al futuro
 
APPSTUDIO: DA ZERO ALLO STORE IN 50 MINUTI!
APPSTUDIO: DA ZERO ALLO STORE IN 50 MINUTI!APPSTUDIO: DA ZERO ALLO STORE IN 50 MINUTI!
APPSTUDIO: DA ZERO ALLO STORE IN 50 MINUTI!
 
Alla scoperta di gRPC
Alla scoperta di gRPCAlla scoperta di gRPC
Alla scoperta di gRPC
 
Programmazione funzionale: un primo approccio attraverso F#
Programmazione funzionale: un primo approccio attraverso F#Programmazione funzionale: un primo approccio attraverso F#
Programmazione funzionale: un primo approccio attraverso F#
 

Semelhante a Async/Await: make it simple!!

ASP.NET performance optimization
ASP.NET performance optimizationASP.NET performance optimization
ASP.NET performance optimizationAndrea Dottor
 
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con ScalaFranco Lombardo
 
[Laravel Day 2022] Deploy di Laravel su AWS Lambda (from Zero to Hero).pdf
[Laravel Day 2022] Deploy di Laravel su AWS Lambda (from Zero to Hero).pdf[Laravel Day 2022] Deploy di Laravel su AWS Lambda (from Zero to Hero).pdf
[Laravel Day 2022] Deploy di Laravel su AWS Lambda (from Zero to Hero).pdfFrancesco Liuzzi
 
Introduzione a Node.js
Introduzione a Node.jsIntroduzione a Node.js
Introduzione a Node.jsMichele Capra
 
Progetto e implementazione di una pipeline di sviluppo software con tecnologi...
Progetto e implementazione di una pipeline di sviluppo software con tecnologi...Progetto e implementazione di una pipeline di sviluppo software con tecnologi...
Progetto e implementazione di una pipeline di sviluppo software con tecnologi...Mattia Milleri
 
Le novita di visual studio 2012
Le novita di visual studio 2012Le novita di visual studio 2012
Le novita di visual studio 2012Crismer La Pignola
 
Asp.net web form 4.5 - what's new!!
Asp.net web form 4.5 - what's new!!Asp.net web form 4.5 - what's new!!
Asp.net web form 4.5 - what's new!!Massimo Bonanni
 
Alessandro Forte - Realizzare controlli Ajax in ASP.Net
Alessandro Forte - Realizzare controlli Ajax in ASP.NetAlessandro Forte - Realizzare controlli Ajax in ASP.Net
Alessandro Forte - Realizzare controlli Ajax in ASP.NetAlessandro Forte
 
ASP.NET Ajax Community Launch VS2008
ASP.NET Ajax Community Launch VS2008ASP.NET Ajax Community Launch VS2008
ASP.NET Ajax Community Launch VS2008Fabrizio Bernabei
 
Node.js - Server Side Javascript
Node.js - Server Side JavascriptNode.js - Server Side Javascript
Node.js - Server Side JavascriptMatteo Napolitano
 
06 Android - lavorare in background
06 Android - lavorare in background06 Android - lavorare in background
06 Android - lavorare in backgroundspawn150
 
Deep diving C# 4 (Raffaele Rialdi)
Deep diving C# 4 (Raffaele Rialdi)Deep diving C# 4 (Raffaele Rialdi)
Deep diving C# 4 (Raffaele Rialdi)DotNetMarche
 
Customize ASP.NET Core scaffolding
Customize ASP.NET Core scaffoldingCustomize ASP.NET Core scaffolding
Customize ASP.NET Core scaffoldingAndrea Dottor
 
Sencha touch: panoramica e orientamento sul codice
Sencha touch: panoramica e orientamento sul codiceSencha touch: panoramica e orientamento sul codice
Sencha touch: panoramica e orientamento sul codiceGiuseppe Toto
 

Semelhante a Async/Await: make it simple!! (20)

ASP.NET performance optimization
ASP.NET performance optimizationASP.NET performance optimization
ASP.NET performance optimization
 
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con Scala
 
[Laravel Day 2022] Deploy di Laravel su AWS Lambda (from Zero to Hero).pdf
[Laravel Day 2022] Deploy di Laravel su AWS Lambda (from Zero to Hero).pdf[Laravel Day 2022] Deploy di Laravel su AWS Lambda (from Zero to Hero).pdf
[Laravel Day 2022] Deploy di Laravel su AWS Lambda (from Zero to Hero).pdf
 
Introduzione a Struts
Introduzione a StrutsIntroduzione a Struts
Introduzione a Struts
 
Introduzione a node.js
Introduzione a node.jsIntroduzione a node.js
Introduzione a node.js
 
Introduzione a Node.js
Introduzione a Node.jsIntroduzione a Node.js
Introduzione a Node.js
 
Progetto e implementazione di una pipeline di sviluppo software con tecnologi...
Progetto e implementazione di una pipeline di sviluppo software con tecnologi...Progetto e implementazione di una pipeline di sviluppo software con tecnologi...
Progetto e implementazione di una pipeline di sviluppo software con tecnologi...
 
Corso Javascript
Corso JavascriptCorso Javascript
Corso Javascript
 
Le novita di visual studio 2012
Le novita di visual studio 2012Le novita di visual studio 2012
Le novita di visual studio 2012
 
Asp.net web form 4.5 - what's new!!
Asp.net web form 4.5 - what's new!!Asp.net web form 4.5 - what's new!!
Asp.net web form 4.5 - what's new!!
 
Silex, iniziamo
Silex, iniziamoSilex, iniziamo
Silex, iniziamo
 
Alessandro Forte - Realizzare controlli Ajax in ASP.Net
Alessandro Forte - Realizzare controlli Ajax in ASP.NetAlessandro Forte - Realizzare controlli Ajax in ASP.Net
Alessandro Forte - Realizzare controlli Ajax in ASP.Net
 
ASP.NET Ajax Community Launch VS2008
ASP.NET Ajax Community Launch VS2008ASP.NET Ajax Community Launch VS2008
ASP.NET Ajax Community Launch VS2008
 
Novità di Asp.Net 4.0
Novità di Asp.Net 4.0Novità di Asp.Net 4.0
Novità di Asp.Net 4.0
 
Node.js - Server Side Javascript
Node.js - Server Side JavascriptNode.js - Server Side Javascript
Node.js - Server Side Javascript
 
06 Android - lavorare in background
06 Android - lavorare in background06 Android - lavorare in background
06 Android - lavorare in background
 
Programming iOS lezione 4
Programming iOS lezione 4Programming iOS lezione 4
Programming iOS lezione 4
 
Deep diving C# 4 (Raffaele Rialdi)
Deep diving C# 4 (Raffaele Rialdi)Deep diving C# 4 (Raffaele Rialdi)
Deep diving C# 4 (Raffaele Rialdi)
 
Customize ASP.NET Core scaffolding
Customize ASP.NET Core scaffoldingCustomize ASP.NET Core scaffolding
Customize ASP.NET Core scaffolding
 
Sencha touch: panoramica e orientamento sul codice
Sencha touch: panoramica e orientamento sul codiceSencha touch: panoramica e orientamento sul codice
Sencha touch: panoramica e orientamento sul codice
 

Mais de Massimo Bonanni

Empower every Azure Function to achieve more!!
Empower every Azure Function to achieve more!!Empower every Azure Function to achieve more!!
Empower every Azure Function to achieve more!!Massimo Bonanni
 
Durable Functions vs Logic App : la guerra dei workflow!!
Durable Functions vs Logic App : la guerra dei workflow!!Durable Functions vs Logic App : la guerra dei workflow!!
Durable Functions vs Logic App : la guerra dei workflow!!Massimo Bonanni
 
Stateful pattern con Azure Functions
Stateful pattern con Azure FunctionsStateful pattern con Azure Functions
Stateful pattern con Azure FunctionsMassimo Bonanni
 
Architetture Serverless con SQL Server e Azure Functions
Architetture Serverless con SQL Server e Azure FunctionsArchitetture Serverless con SQL Server e Azure Functions
Architetture Serverless con SQL Server e Azure FunctionsMassimo Bonanni
 
Tutto quello che avreste voluto sapere sull'API Management (e non avete mai o...
Tutto quello che avreste voluto sapere sull'API Management (e non avete mai o...Tutto quello che avreste voluto sapere sull'API Management (e non avete mai o...
Tutto quello che avreste voluto sapere sull'API Management (e non avete mai o...Massimo Bonanni
 
Stateful patterns in Azure Functions
Stateful patterns in Azure FunctionsStateful patterns in Azure Functions
Stateful patterns in Azure FunctionsMassimo Bonanni
 
The art of Azure Functions (unit) testing and monitoring
The art of Azure Functions (unit) testing and monitoringThe art of Azure Functions (unit) testing and monitoring
The art of Azure Functions (unit) testing and monitoringMassimo Bonanni
 
Empower every Azure Function to achieve more!!
Empower every Azure Function to achieve more!!Empower every Azure Function to achieve more!!
Empower every Azure Function to achieve more!!Massimo Bonanni
 
The art of Azure Functions (unit) testing and monitoring
The art of Azure Functions (unit) testing and monitoringThe art of Azure Functions (unit) testing and monitoring
The art of Azure Functions (unit) testing and monitoringMassimo Bonanni
 
Everything you always wanted to know about API Management (but were afraid to...
Everything you always wanted to know about API Management (but were afraid to...Everything you always wanted to know about API Management (but were afraid to...
Everything you always wanted to know about API Management (but were afraid to...Massimo Bonanni
 
Workflow as code with Azure Durable Functions
Workflow as code with Azure Durable FunctionsWorkflow as code with Azure Durable Functions
Workflow as code with Azure Durable FunctionsMassimo Bonanni
 
Xmas Serverless Transformation: when the elf doesn’t scale!
Xmas Serverless Transformation: when the elf doesn’t scale!Xmas Serverless Transformation: when the elf doesn’t scale!
Xmas Serverless Transformation: when the elf doesn’t scale!Massimo Bonanni
 
Welcome Azure Functions 2. 0
Welcome Azure Functions 2. 0Welcome Azure Functions 2. 0
Welcome Azure Functions 2. 0Massimo Bonanni
 
Discovering the Service Fabric's actor model
Discovering the Service Fabric's actor modelDiscovering the Service Fabric's actor model
Discovering the Service Fabric's actor modelMassimo Bonanni
 
Testing a Service Fabric solution and live happy!!
Testing a Service Fabric solution and live happy!!Testing a Service Fabric solution and live happy!!
Testing a Service Fabric solution and live happy!!Massimo Bonanni
 
Discovering the Service Fabric's actor model
Discovering the Service Fabric's actor modelDiscovering the Service Fabric's actor model
Discovering the Service Fabric's actor modelMassimo Bonanni
 
Soluzioni IoT con le tecnologie Microsoft
Soluzioni IoT con le tecnologie MicrosoftSoluzioni IoT con le tecnologie Microsoft
Soluzioni IoT con le tecnologie MicrosoftMassimo Bonanni
 
Project Gesture & Real Sense: il potere nelle mani!!
Project Gesture & Real Sense: il potere nelle mani!!Project Gesture & Real Sense: il potere nelle mani!!
Project Gesture & Real Sense: il potere nelle mani!!Massimo Bonanni
 

Mais de Massimo Bonanni (20)

Empower every Azure Function to achieve more!!
Empower every Azure Function to achieve more!!Empower every Azure Function to achieve more!!
Empower every Azure Function to achieve more!!
 
Durable Functions vs Logic App : la guerra dei workflow!!
Durable Functions vs Logic App : la guerra dei workflow!!Durable Functions vs Logic App : la guerra dei workflow!!
Durable Functions vs Logic App : la guerra dei workflow!!
 
Stateful pattern con Azure Functions
Stateful pattern con Azure FunctionsStateful pattern con Azure Functions
Stateful pattern con Azure Functions
 
Architetture Serverless con SQL Server e Azure Functions
Architetture Serverless con SQL Server e Azure FunctionsArchitetture Serverless con SQL Server e Azure Functions
Architetture Serverless con SQL Server e Azure Functions
 
IoT in salsa serverless
IoT in salsa serverlessIoT in salsa serverless
IoT in salsa serverless
 
Tutto quello che avreste voluto sapere sull'API Management (e non avete mai o...
Tutto quello che avreste voluto sapere sull'API Management (e non avete mai o...Tutto quello che avreste voluto sapere sull'API Management (e non avete mai o...
Tutto quello che avreste voluto sapere sull'API Management (e non avete mai o...
 
Stateful patterns in Azure Functions
Stateful patterns in Azure FunctionsStateful patterns in Azure Functions
Stateful patterns in Azure Functions
 
IoT in salsa Serverless
IoT in salsa ServerlessIoT in salsa Serverless
IoT in salsa Serverless
 
The art of Azure Functions (unit) testing and monitoring
The art of Azure Functions (unit) testing and monitoringThe art of Azure Functions (unit) testing and monitoring
The art of Azure Functions (unit) testing and monitoring
 
Empower every Azure Function to achieve more!!
Empower every Azure Function to achieve more!!Empower every Azure Function to achieve more!!
Empower every Azure Function to achieve more!!
 
The art of Azure Functions (unit) testing and monitoring
The art of Azure Functions (unit) testing and monitoringThe art of Azure Functions (unit) testing and monitoring
The art of Azure Functions (unit) testing and monitoring
 
Everything you always wanted to know about API Management (but were afraid to...
Everything you always wanted to know about API Management (but were afraid to...Everything you always wanted to know about API Management (but were afraid to...
Everything you always wanted to know about API Management (but were afraid to...
 
Workflow as code with Azure Durable Functions
Workflow as code with Azure Durable FunctionsWorkflow as code with Azure Durable Functions
Workflow as code with Azure Durable Functions
 
Xmas Serverless Transformation: when the elf doesn’t scale!
Xmas Serverless Transformation: when the elf doesn’t scale!Xmas Serverless Transformation: when the elf doesn’t scale!
Xmas Serverless Transformation: when the elf doesn’t scale!
 
Welcome Azure Functions 2. 0
Welcome Azure Functions 2. 0Welcome Azure Functions 2. 0
Welcome Azure Functions 2. 0
 
Discovering the Service Fabric's actor model
Discovering the Service Fabric's actor modelDiscovering the Service Fabric's actor model
Discovering the Service Fabric's actor model
 
Testing a Service Fabric solution and live happy!!
Testing a Service Fabric solution and live happy!!Testing a Service Fabric solution and live happy!!
Testing a Service Fabric solution and live happy!!
 
Discovering the Service Fabric's actor model
Discovering the Service Fabric's actor modelDiscovering the Service Fabric's actor model
Discovering the Service Fabric's actor model
 
Soluzioni IoT con le tecnologie Microsoft
Soluzioni IoT con le tecnologie MicrosoftSoluzioni IoT con le tecnologie Microsoft
Soluzioni IoT con le tecnologie Microsoft
 
Project Gesture & Real Sense: il potere nelle mani!!
Project Gesture & Real Sense: il potere nelle mani!!Project Gesture & Real Sense: il potere nelle mani!!
Project Gesture & Real Sense: il potere nelle mani!!
 

Último

Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Associazione Digital Days
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Associazione Digital Days
 
Programma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoProgramma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoQuotidiano Piemontese
 
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Associazione Digital Days
 
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Associazione Digital Days
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Associazione Digital Days
 
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Associazione Digital Days
 
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Associazione Digital Days
 
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Associazione Digital Days
 

Último (9)

Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
 
Programma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoProgramma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 Torino
 
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
 
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
 
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
 
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
 
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
 

Async/Await: make it simple!!

  • 1. Async/Await make it simple!! Massimo Bonanni http://codetailor.blogspot.com massimo.bonanni@domusdotnet.org @massimobonanni
  • 2. 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
  • 3. Cos’è «Asincrono» «Il lavoro di un cameriere consiste nell’attendere ad un tavolo finché il cliente non ha terminato il pasto! Se vuoi servire due tavoli, hai bisogno di due camerieri!» «Non hai bisogno di due camerieri! Un unico cameriere può facilmente servire due tavoli contemporaneamente, semplicemente passando da uno all’altro»
  • 4. Cosè “Asincrono” Pensiamo al cameriere come un thread, e il tavolo come un metodo da eseguire. In un approccio tradizionale, per eseguire due compiti contemporaneamente (ad esempio, mantenere l'interfaccia utente sensibile durante il download di un file), si sarebbero utilizzati due thread. Creare thread è inefficiente (assumere camerieri noleggio) e si deve combattere parecchio per aggiornare le UI dal thread in background (fare in modo che i camerieri non siano in conflitto).
  • 5. Asincrono vs Sincrono: perchè e come! asincrono [a-sìn-cro-no] agg. «dispositivo che opera senza un riferimento temporale di sincronizzazione rispetto a un altro dispositivo» ↓ «non [a] nello stesso tempo»
  • 6. Cosa non è «Asincrono» Asincrono non significa «eseguito in background»!! Eseguire un’operazione in background è una delle possibili implementazioni di asincrono, non l’unica e, a volte, neanche la migliore
  • 7. Asincrono vs Sincrono: perchè e come! Un approccio asincrono garantisce che le nostre interfacce grafiche siano: • Responsive • Non bloccate da logiche di accesso ai dati (sia per dati locali che remoti)
  • 9. L’asincrono prima di Async/Await Il framework .NET, prima dell’introduzione della TPL, prevedeva due modalità di implementazione del pattern asincrono: • Asynchronous Programming Model (APM) • Event-based Asynchronous Pattern (EAP)
  • 10. Asynchronous Programming Model APM si basa sul design pattern IAsyncResult e prevede che le operazioni asincrone siano individuate da una coppia di metodi caratterizzati dai prefissi Begin/End. Un esempio è dato dalla classe FileStream con i suoi metodi BeginRead e EndRead.
  • 11. Asynchronous Programming Model Per utilizzare questo tipo di chiamate asincrone sono 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).
  • 12. Event-based Asynchronous Pattern Le operazioni asincrone sono rappresentate da una coppia Metodo/Evento. Il metodo è identificato dal suffisso Async mentre l’evento dal suffisso Completed. Nell’argomento dell’evento sono, generalmente, riportati i risultati dell’operazione. Un esempio presente nel framework .NET è il metodo DownloadStringAsync (e il corrispettivo evento DownloadStringCompleted) della classe WebClient
  • 13. Event-based Asynchronous Pattern EAP è stato introdotto con la versione 2.0 del framework .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.
  • 15. Cosa sono Async/Await Vantaggi 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.
  • 16. Cosa sono Async/Await La parola chiave Async indica al compilatore che un metodo (sia esso classico che una lamdba expression) è asicrono e che, quindi, al suo interno possono trovare posto dei punti di “sospensione” identificati dalla parola chiave Await.
  • 17. Cosa sono Async/Await La parola chiave Await indica al compilatore che il metodo a cui fa riferimento deve essere invocato in maniera asincrona, inserendo una “sospensione” nel flusso di esecuzione, per riprendere dal metodo successivo nel momento in cui tale metodo asincrono è terminato. Nel frattempo, controllo viene restituito al chiamante del metodo asincrono garantendo che questo non sia bloccato.
  • 18. Async/Await e i Task La classe Task è uno strumento con cui implementare metodi «awaitabili» (l’altro è l’interfaccia IAsyncOperation) La parola chiave Await davanti ad una funzione che ritorna un Task, ne cambia «magicamente» il valore di ritorno (e il comportamento):
  • 19. Async/Await e i Task Esempio: metodo DownloadStringTaskAsync della classe WebClient Un metodo che restituisce un Task è definito «Awaitable» e può essere usato in maniera asincrona anteponendo Await:
  • 21. La «magia» del compilatore Il compilatore, grazie alle parole chiave Async 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.
  • 22. La «magia» del compilatore Il compilatore, dietro le quinte, crea una macchina a stati i cui stati sono i possibili flussi tra i diversi metodi «Awaitabili» richiamati. Per ogni metodo Async, viene creata una struttura che implementa l’interfaccia IAsyncStateMachine deputata alla gestione della macchina a stati.
  • 23. Async/Await e i thread L’uso di Async/Await può generare o meno la creazione di nuovi thread. Un metodo Async «gira» nel «synchronization context» corrente. Solo nel caso di Task.Run avremo l’effettiva creazione di un thread separato (sincronizzato dal compilatore).
  • 24. DEMO Numeri primi in Async/Await
  • 25. Annullare l’esecuzione di un Async In alcuni casi può essere necessario annullare una operazione Async. Poiché alla base del paradigma Async/Await c’è il Task, possiamo ricorrere al CancellationToken per annullare un’operazione asincrona esattamente come faremo per un Task.
  • 26. DEMO Numeri primi in Async/Await - Cancellation
  • 27. Progress di un Async Se vogliamo supportare l’aggiornamento dell’interfaccia grafica, possiamo utilizzare l’interfaccia IProgress(Of T). E’ sufficiente prevedere un parametro di tipo IProgress(Of T) con T il tipo da comunicare alla UI per l’aggiornamento.
  • 28. DEMO Numeri primi in Async/Await - Progress
  • 29. Riutilizzare vecchio codice Se abbiamo del codice «legacy» che dobbiamo rapidamente 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
  • 30. Riutilizzare vecchio codice Se 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 metodo DownloadString della classe WebClient, è meglio sostituirlo con il metodo DownloadStringTaskAsync piuttosto che incapsulare tutto il nostro metodo in un task.
  • 31. Async/Await e Windows Store Apps Tutte le operazioni che, potenzialmente, possono durare più di 50ms, sono asincrone! Il framework per le Windows Store Apps espone, per queste operazioni, solo ed esclusivamente i metodi Async! Ragionate nello stesso modo per le vostre applicazioni (senza esagerare)!
  • 32. Async/Await e .NET framework 4.0 Possiamo utilizzare il pattern Async/Await anche con il framework 4.0 utilizzando l’Async Targetting Pack. Il pack permette di usare Await in VS2012 con le seguenti versioni di progetto: • .NET Framework 4.0 (con KB2468871) • Silverlight 4 e 5 • Windows Phone 7.5 • Portable Class Libraries per le precedenti piattaforme
  • 33. Q&A Se avete domande non fatele in asincrono ..... fatele ora!!!
  • 35. Riferimenti Async Targeting Pack per VS2012 http://www.microsoft.com/en-us/download/details.aspx?id=29576 Asynchronous Programming with Async and Await (C# and Visual Basic) http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx Asynchronous programming (Windows Store apps) http://msdn.microsoft.com/en- us/library/windows/apps/hh464924.aspx Base Class Library (BCL) Blog http://blogs.msdn.com/b/bclteam/