Programmazione asincrona

Questo argomento descrive la programmazione asincrona nella piattaforma UWP (Universal Windows Platform) e la relativa rappresentazione in C#, Microsoft Visual Basic .NET, C++ e JavaScript.

Grazie alla programmazione asincrona, l'app rimane reattiva quando esegue operazioni che potrebbero richiedere un periodo di tempo prolungato. Ad esempio, un'app che scarica il contenuto da Internet potrebbe rimanere in attesa parecchi secondi priva che arrivi il contenuto. Se si è usato un metodo sincrono nel thread dell'interfaccia utente per recuperare il contenuto, l'app rimane bloccata finché il metodo non restituisce un risultato. Un'app che non risponde all'interazione dell'utente e sembra bloccata può generare frustrazione nell'utente. Un modo molto più efficace consiste nell'usare la programmazione asincrona, grazie alla quale l'app continua a funzionare e a rispondere all'interfaccia utente anche se è in attesa del completamento di un'operazione.

Per i metodi il cui completamento potrebbe richiedere molto tempo, la programmazione asincrona è la norma e non l'eccezione nella piattaforma UWP. JavaScript, C#, Visual Basic e C++ forniscono tutti il supporto del linguaggio per i metodi asincroni.

Programmazione asincrona sulla piattaforma UWP

Molte funzionalità UWP, ad esempio le API MediaCapture e StorageFile, sono esposte come API asincrone. Per convenzione, i nomi delle API asincrone terminano con "Async" per indicare che parte dell'esecuzione avviene probabilmente dopo che il controllo è tornato al chiamante.

Quando si usano le API asincrone nell'app UWP (Universal Windows Platform), il codice effettua chiamate non bloccanti in modo coerente. Quando si implementano questi modelli asincroni nelle definizioni delle API, i chiamanti possono comprendere e usare il codice in modo prevedibile.

Ecco alcune attività comuni che richiedono la chiamata di API Windows Runtime asincrone.

  • Visualizzazione di una finestra di dialogo con messaggio

  • Uso del file system, visualizzazione di una selezione file

  • Invio e ricezione di dati a e da Internet

  • Uso di socket, flussi, connettività

  • Uso di appuntamenti, contatti, calendario

  • Uso di tipi di file, ad esempio apertura di file PDF (Portable Document Format) o decodifica di formati di immagine o multimediali

  • Interazione con un dispositivo o un servizio

Con il modello asincrono UWP, è possibile evitare di gestire in modo esplicito i thread. Ogni linguaggio di programmazione supporta il modello asincrono per la piattaforma UWP in un modo proprio:

Linguaggio di programmazione Rappresentazione asincrona
C# parola chiave async, operatore await
Visual Basic parola chiave Async, operatore Await
C++/WinRT coroutine e operatore co_await
C++/CX classe task, metodo .then
JavaScript oggetto promise, funzione then

Modelli asincroni in UWP con C# e Visual Basic

Un tipico segmento di codice scritto in C# o Visual Basic viene eseguito in modo sincrono, il che significa che si attende la fine dell'esecuzione della riga corrente prima di avviare quella successiva. Esistono modelli di programmazione Microsoft .NET precedenti per l'esecuzione asincrona, ma il codice risultante tende a sottolineare il meccanismo di esecuzione del codice asincrono anziché concentrarsi sull'attività che il codice sta tentando di eseguire. I compilatori UWP, .NET Framework, C# e Visual Basic dispongono di altre funzionalità che astraggono i meccanismi asincroni dal codice. Per .NET e UWP è possibile scrivere codice asincrono specifico delle operazioni eseguite dal codice anziché del modo e dei tempi di esecuzione. Il codice asincrono avrà un aspetto ragionevolmente simile al codice sincrono. Per altre informazioni, vedere Chiamare API asincrone in C# o Visual Basic.

Modelli asincroni in UWP con C++/WinRT

Con C++/WinRT si usano coroutine e l'operatore co_await . Per altre informazioni ed esempi di codice, vedere Programmazione asincrona in C++/WinRT.

Modelli asincroni in UWP con C++/CX

In C++/CX, la programmazione asincrona si basa sulla classe task e sul relativo metodo then. La sintassi è simile a quella delle promesse JavaScript. La classe task e i tipi correlati offrono le funzionalità di annullamento e gestione del contenuto del thread. Per altre informazioni, vedere Programmazione asincrona in C++/CX.

La funzione create_async fornisce il supporto per produrre API asincrone da usare da JavaScript o da qualsiasi altro linguaggio che supporta UWP. Per altre informazioni, vedere Creazione di operazioni asincrone in C++/CX.

Modelli asincroni in UWP con JavaScript

In JavaScript la programmazione asincrona segue lo standard proposto Common JS Promises/A con metodi asincroni che restituiscono oggetti promise. Gli oggetti promise vengono usati sia sulla piattaforma UWP sia nella libreria Windows per JavaScript.

Un oggetto promise rappresenta un valore che verrà soddisfatto in futuro. In UWP si ottiene un oggetto promise da una funzione factory, che per convenzione ha un nome che termina con "Async".

In molti casi, la chiamata a una funzione asincrona è pressoché semplice quanto la chiamata a una funzione convenzionale. La differenza sta nell'uso del metodo then o done per assegnare i gestori per risultati o errori e avviare l'operazione.