Programação Dart - Async

A asynchronous operation executa em um thread, separado do mainthread do aplicativo. Quando um aplicativo chama um método para realizar uma operação de forma assíncrona, o aplicativo pode continuar executando enquanto o método assíncrono realiza sua tarefa.

Exemplo

Vamos dar um exemplo para entender esse conceito. Aqui, o programa aceita entrada do usuário usando oIO 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"); 
}

o readLineSync()é um método síncrono. Isso significa que a execução de todas as instruções que seguem oreadLineSync() chamada de função será bloqueada até o readLineSync() método termina a execução.

o stdin.readLineSyncaguarda entrada. Ele para em suas trilhas e não executa mais nada até receber a entrada do usuário.

O exemplo acima resultará no seguinte output -

Enter your name :     
Tom                   

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

Na computação, dizemos que algo é synchronousquando espera que um evento aconteça antes de continuar. Uma desvantagem dessa abordagem é que, se uma parte do código demorar muito para ser executada, os blocos subsequentes, embora não relacionados, terão sua execução bloqueada. Considere um servidor da web que deve responder a várias solicitações de um recurso.

Um modelo de execução síncrona bloqueará todas as solicitações de outros usuários até concluir o processamento da solicitação atual. Nesse caso, como o de um servidor web, cada solicitação deve ser independente das outras. Isso significa que o servidor da Web não deve esperar que a solicitação atual termine de ser executada antes de responder à solicitação de outros usuários.

Simplificando, ele deve aceitar solicitações de novos usuários antes de necessariamente completar as solicitações de usuários anteriores. Isso é denominado assíncrono. A programação assíncrona significa basicamente nenhum modelo de programação em espera ou sem bloqueio. odart:async pacote facilita a implementação de blocos de programação assíncrona em um script Dart.

Exemplo

O exemplo a seguir ilustra melhor o funcionamento de um bloco assíncrono.

Step 1 - Crie um contact.txt arquivo conforme fornecido abaixo and salve-o na pasta de dados do projeto atual.

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

Step 2 - Escreva um programa que irá ler o arquivo sem bloquear outras partes do aplicativo.

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 
}

o output deste programa será o seguinte -

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

O "fim de main" é executado primeiro enquanto o script continua lendo o arquivo. oFuture classe, parte de dart:async, é usado para obter o resultado de um cálculo após a conclusão de uma tarefa assíncrona. esteFuture valor é então usado para fazer algo após o término do cálculo.

Assim que a operação de leitura for concluída, o controle de execução é transferido dentro "then()". Isso ocorre porque a operação de leitura pode levar mais tempo e, portanto, não deseja bloquear outra parte do programa.

Dart Future

A comunidade Dart define um Futurecomo "um meio de obter um valor em algum momento no futuro". Simplificando,Future objectssão um mecanismo para representar valores retornados por uma expressão cuja execução será concluída em um momento posterior. Várias das classes integradas do Dart retornam umFuture quando um método assíncrono é chamado.

Dart é uma linguagem de programação de thread único. Se algum código bloquear o thread de execução (por exemplo, aguardando uma operação demorada ou bloqueando a E / S), o programa congela efetivamente.

As operações assíncronas permitem que seu programa seja executado sem ser bloqueado. Dart usaFuture objects para representar operações assíncronas.