Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Don’t await … try async/await !

Don’t await … try async/await !

Introduzione alla programmazione asincrona in C# utilizzando async/await

Andrea Ceroni

March 16, 2017
Tweet

More Decks by Andrea Ceroni

Other Decks in Programming

Transcript

  1. Argomenti Concorrenza Thread e Task CPU-boundvs IO-bound APMe EAP …la

    preistoria! async/await Async best practices 1/18
  2. 11/18 cattura il contesto sembra di scrivere codice sincrono il

    lavoro “sporco” è svolto dal compilatore async / await
  3. 12/18 async await keywords public 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 asincrono prende un awaitable (operazione asincrona) e verifica se è già completa se è completa il flusso continua in modo sincrono altrimenti chiede all’awaitable di eseguire il resto del metodo quando avrà terminato e ritorna quando awaitable termina il resto del metodo viene eseguito nel contestocatturato
  4. 13/18 Task type public 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; }
  5. 14/18 Contesto 1. se siamo sullo UI thread è UI

    context 2. se stiamo rispondendo ad una request ASP.NET, è il request context 3. altrimenti in quasi tutti gli altri casi è il thread pool context (TaskScheduler.Default) //WPF public async void DownloadButton_Click(object sender, EventArgs e) { await DownloadFileAsync(...); resultTextBox.Text = "File downloaded!"; } //ASP.NET public async void DownloadButton_Click(object sender, EventArgs e) { await DownloadFileAsync(...); Response.Write("File downloaded!"); }
  6. 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