Programmazione Dart - Async

Un asynchronous operation viene eseguito in un thread, separato da mainthread dell'applicazione. Quando un'applicazione chiama un metodo per eseguire un'operazione in modo asincrono, l'applicazione può continuare l'esecuzione mentre il metodo asincrono esegue la sua attività.

Esempio

Facciamo un esempio per capire questo concetto. Qui, il programma accetta l'input dell'utente utilizzando ilIO library.

import 'dart:io'; 
void main() { 
   print("Enter your name :");            
   
   // prompt for user input 
   String name = stdin.readLineSync();  
   
   // this is a synchronous method that reads user input 
   print("Hello Mr. ${name}"); 
   print("End of main"); 
}

Il readLineSync()è un metodo sincrono. Ciò significa che l'esecuzione di tutte le istruzioni che seguono ilreadLineSync() la chiamata di funzione sarà bloccata fino al readLineSync() il metodo termina l'esecuzione.

Il stdin.readLineSyncattende l'input. Si ferma sulle sue tracce e non viene più eseguito finché non riceve l'input dell'utente.

L'esempio sopra risulterà nel seguente output -

Enter your name :     
Tom                   

// reads user input  
Hello Mr. Tom 
End of main

In informatica, diciamo che qualcosa lo è synchronousquando attende che si verifichi un evento prima di continuare. Uno svantaggio di questo approccio è che se una parte del codice impiega troppo tempo per essere eseguita, l'esecuzione dei blocchi successivi, sebbene non correlati, verrà bloccata. Considera un server web che deve rispondere a più richieste per una risorsa.

Un modello di esecuzione sincrono bloccherà la richiesta di ogni altro utente fino al termine dell'elaborazione della richiesta corrente. In tal caso, come quello di un web server, ogni richiesta deve essere indipendente dalle altre. Ciò significa che il server Web non deve attendere il completamento dell'esecuzione della richiesta corrente prima di rispondere alla richiesta di altri utenti.

In poche parole, dovrebbe accettare richieste da nuovi utenti prima di completare necessariamente le richieste degli utenti precedenti. Questo è definito asincrono. La programmazione asincrona significa fondamentalmente nessun modello di programmazione in attesa o non bloccante. Ildart:async pacchetto facilita l'implementazione di blocchi di programmazione asincroni in uno script Dart.

Esempio

Il seguente esempio illustra meglio il funzionamento di un blocco asincrono.

Step 1 - Crea un file contact.txt file come indicato di seguito and salvalo nella cartella dei dati del progetto corrente.

1, Tom 
2, John 
3, Tim 
4, Jane

Step 2 - Scrivere un programma che leggerà il file senza bloccare altre parti dell'applicazione.

import "dart:async"; 
import "dart:io";  

void main(){ 
   File file = new File( Directory.current.path+"\\data\\contact.txt"); 
   Future<String> f = file.readAsString();  
  
   // returns a futrue, this is Async method 
   f.then((data)=>print(data));  
   
   // once file is read , call back method is invoked  
   print("End of main");  
   // this get printed first, showing fileReading is non blocking or async 
}

Il output di questo programma sarà il seguente:

End of main 
1, Tom 
2, John 
3, Tim 
4, Jan

La "fine del main" viene eseguita per prima mentre lo script continua a leggere il file. IlFuture classe, parte di dart:async, viene utilizzato per ottenere il risultato di un calcolo dopo il completamento di un'attività asincrona. QuestoFuture value viene quindi utilizzato per fare qualcosa al termine del calcolo.

Una volta completata l'operazione di lettura, il controllo dell'esecuzione viene trasferito all'interno "then()". Questo perché l'operazione di lettura può richiedere più tempo e quindi non vuole bloccare altre parti del programma.

Dart Future

La comunità Dart definisce un file Futurecome "mezzo per ottenere un valore in futuro". In poche parole,Future objectssono un meccanismo per rappresentare i valori restituiti da un'espressione la cui esecuzione verrà completata in un secondo momento. Molte delle classi integrate di Dart restituiscono un fileFuture quando viene chiamato un metodo asincrono.

Dart è un linguaggio di programmazione a thread singolo. Se un qualsiasi codice blocca il thread di esecuzione (ad esempio, aspettando un'operazione che richiede tempo o bloccando l'I / O), il programma si blocca effettivamente.

Le operazioni asincrone consentono l'esecuzione del programma senza essere bloccato. Dart utilizzaFuture objects per rappresentare operazioni asincrone.