async e await in C#

Questa esercitazione discuterà della programmazione asincrona in C#.

Programmazione asincrona in C

Se un processo viene bloccato in un’applicazione sincrona, l’intera applicazione viene bloccata e smette di rispondere fino al completamento di quel particolare processo. Possiamo usare programmazione asincrona in questo scenario. Con la programmazione asincrona, la nostra applicazione può continuare a lavorare in background su alcune attività indipendenti fino all’esecuzione di questo particolare processo. Nella programmazione asincrona, l’intera nostra applicazione non dipende semplicemente da un singolo processo che richiede tempo. La programmazione asincrona viene utilizzata con attività associate a I/O o CPU. L’utilizzo principale della programmazione asincrona consiste nel creare un’interfaccia utente reattiva che non si blocchi durante l’attesa del completamento dell’esecuzione di un processo vincolato a I/O o CPU. Le parole chiave await e async vengono utilizzate per la programmazione asincrona in C#. La parola chiave await restituisce il controllo alla funzione chiamante. La parola chiave await è la parola chiave principale che consente la programmazione asincrona in C#. La parola chiave async abilita la parola chiave await. Una funzione che utilizza la parola chiave await deve avere la parola chiave async e restituire un oggetto Task in C#. La parola chiave await non può essere utilizzata senza la parola chiave async in C#. Nell’esempio di codice seguente viene illustrata la programmazione sincrona in C#.

using System;
using System.Threading.Tasks;

namespace async_and_await
{
    class Program
    {
        public static void process1()
        {
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("Process 1");
                Task.Delay(100).Wait();
            }
        }
        public static void process2()
        {
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("Process 2");
                Task.Delay(100).Wait();
            }
        }
        static void Main(string[] args)
        {
            process1();
            process2();
        }
    }
}

Produzione:

Process 1
Process 1
Process 1
Process 1
Process 1
Process 2
Process 2
Process 2
Process 2
Process 2

Nel codice precedente, le funzioni process1() e process2() sono processi indipendenti ma la funzione process2() deve attendere il completamento della funzione process1(). Questo semplice codice di programmazione sincrono può essere convertito in programmazione asincrona con le parole chiave async e await in C#.

using System;
using System.Threading.Tasks;

namespace async_and_await
{
    class Program
    {
        public static async Task process1()
        {
            await Task.Run(() =>
            {
                for (int i = 0; i < 5; i++)
                {
                    Console.WriteLine("Process 1");
                    Task.Delay(100).Wait();
                }
            });
        }
        public static void process2()
        {
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("Process 2");
                Task.Delay(100).Wait();
            }
        }
        static void Main(string[] args)
        {
            process1();
            process2();
        }
    }
}

Produzione:

Process 2
Process 1
Process 1
Process 2
Process 2
Process 1
Process 1
Process 2
Process 2
Process 1

Nel codice sopra, abbiamo usato le parole chiave async e await per convertire l’esempio precedente in programmazione asincrona. L’output mostra chiaramente che la funzione process2() non attende per completare la funzione process1(). Nella definizione della funzione process1(), abbiamo usato la parola chiave async per suggerire che questa è una funzione in esecuzione in modo asincrono. La parola chiave await nella funzione process1() restituisce il controllo alla funzione principale, che quindi chiama la funzione process2(). Il controllo continua a spostarsi tra le funzioni process1() e process2() fino al completamento della funzione process1().