don’t await … try async/await !
TRANSCRIPT
Don’t await … try async/await !
Andrea [email protected]
@andrekiba6
Sponsored by
10 marzo 2016
Relatore
Introduzione ad async/awaitBest practices di programmazione asincrona
Tipo di sessione: Frontale
Durata sessione: 55min
Argomenti
Concorrenza
Thread e Task
CPU-bound vs IO-bound
APM e EAP …la preistoria!
async/await
Async best practices
1/18
Code Q & AIntro
2/18
3/18Cosa è asincrono ?
significa“non nello stesso tempo”
non significa“in background”
4/18Async event-driven
sveglia colazione
5/18
Task
6/18
TaskIO-bound
7/18
TaskCPU-bound
8/18
Concorrenteinterleaved
Parallelosimultaneo
9/18
Continuazionefunzione
10/18
OldCode().Wait();
11/18
cattura il contesto
sembra di scrivere codice sincrono il lavoro “sporco” è
svolto dal compilatore
async / await
12/18
async await keywordspublic async Task DoSomethingAsync(){
await Task.Delay(1000);Console.WriteLine(“ciao!”);
}
async abilita l’uso di await e avverte il compilatore che il metodo sarà trattato in modo “speciale”
await indica un punto di sospensione, qui il flusso diventa effettivamente asincronoprende un awaitable (operazione asincrona) e verifica se è già completa
se è completa il flusso continua in modo sincronoaltrimenti chiede all’awaitable di eseguire il resto del metodo quando avrà terminato e ritorna
quando awaitable termina il resto del metodo viene eseguito nel contesto catturato
13/18
Task typepublic async Task DoSomethingAsync(){
await Task.Delay(1000);Console.WriteLine(“ciao!”);
}
In .NET esistono due awaitable già pronti, Task e Task<T>
N.B. è il tipo che è awaitable, non il metodo che ritorna il tipo!
Un metodo asincrono può ritornare Task, Task<T> oppure void
N.B. un metodo asincrono attende una sola operazione alla volta e un Task è completo una sola volta!
public async Task<int> DoSomethingAsync(){
await Task.Delay(1000);return 6;
}
14/18
Contesto1. se siamo sullo UI thread è UI context2. se stiamo rispondendo ad una request ASP.NET, è il request context3. altrimenti in quasi tutti gli altri casi è il thread pool context (TaskScheduler.Default)
//WPFpublic async void DownloadButton_Click(object sender, EventArgs e){
await DownloadFileAsync(...);resultTextBox.Text = "File downloaded!";
}
//ASP.NETpublic async void DownloadButton_Click(object sender, EventArgs e){
await DownloadFileAsync(...);Response.Write("File downloaded!");
}
15/18
await NewCode();
16/18
Riassunto
Task direttamente per operazioni IO-bound
Task.Run per operazioni CPU-bound
async Task invece di async void
Async all the way, non bloccare codice asincrono
ConfigureAwait(false) se il contesto non è importante
17/18
await Q;if(iKnowTheAnswer)
A; J
18/18
Grazie!