Programowanie w rzutki - asynchroniczne
Na asynchronous operation wykonuje w wątku, niezależnie od mainwątek aplikacji. Gdy aplikacja wywołuje metodę w celu wykonania operacji asynchronicznie, aplikacja może kontynuować wykonywanie, podczas gdy metoda asynchroniczna wykonuje swoje zadanie.
Przykład
Weźmy przykład, aby zrozumieć tę koncepcję. W tym przypadku program akceptuje dane wejściowe użytkownika za pomocą rozszerzeniaIO 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");
}
Plik readLineSync()jest metodą synchroniczną. Oznacza to, że wykonanie wszystkich instrukcji następujących poreadLineSync() wywołanie funkcji zostanie zablokowane do readLineSync() metoda kończy wykonywanie.
Plik stdin.readLineSyncczeka na wejście. Zatrzymuje się na swoich ścieżkach i nie wykonuje dalej, dopóki nie otrzyma danych wejściowych użytkownika.
Powyższy przykład spowoduje, że output -
Enter your name :
Tom
// reads user input
Hello Mr. Tom
End of main
W informatyce mówimy, że coś jest synchronouskiedy czeka na wystąpienie zdarzenia przed kontynuowaniem. Wadą tego podejścia jest to, że jeśli wykonanie części kodu trwa zbyt długo, wykonanie kolejnych bloków, choć niepowiązanych, będzie blokowane. Rozważ serwer WWW, który musi odpowiadać na wiele żądań zasobu.
Model wykonywania synchronicznego będzie blokować żądanie każdego innego użytkownika, dopóki nie zakończy przetwarzania bieżącego żądania. W takim przypadku, podobnie jak w przypadku serwera WWW, każde żądanie musi być niezależne od innych. Oznacza to, że serwer WWW nie powinien czekać na zakończenie wykonywania bieżącego żądania, zanim odpowie na żądanie innych użytkowników.
Mówiąc najprościej, powinien akceptować żądania od nowych użytkowników, zanim koniecznie zrealizuje żądania poprzednich użytkowników. Jest to określane jako asynchroniczne. Programowanie asynchroniczne oznacza w zasadzie brak czekającego lub nieblokującego modelu programowania. Plikdart:async Pakiet ułatwia implementację asynchronicznych bloków programistycznych w skrypcie Dart.
Przykład
Poniższy przykład lepiej ilustruje działanie bloku asynchronicznego.
Step 1 - Utwórz plik contact.txt plik, jak podano poniżej and zapisz go w folderze danych w bieżącym projekcie.
1, Tom
2, John
3, Tim
4, Jane
Step 2 - Napisz program, który odczyta plik bez blokowania innych części aplikacji.
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
}
Plik output tego programu będzie następująco -
End of main
1, Tom
2, John
3, Tim
4, Jan
„End of main” jest wykonywany jako pierwszy, podczas gdy skrypt kontynuuje odczytywanie pliku. PlikFuture klasa, część dart:async, służy do uzyskiwania wyniku obliczenia po zakończeniu zadania asynchronicznego. ToFuture value jest następnie używana do zrobienia czegoś po zakończeniu obliczeń.
Po zakończeniu operacji odczytu kontrola wykonania jest przenoszona w ramach "then()". Dzieje się tak, ponieważ operacja odczytu może zająć więcej czasu i dlatego nie chce blokować innej części programu.
Dart Future
Społeczność Dart definiuje Futurejako „sposób na uzyskanie wartości kiedyś w przyszłości”. Mówiąc najprościej,Future objectssą mechanizmem reprezentującym wartości zwracane przez wyrażenie, którego wykonanie zakończy się w późniejszym czasie. Kilka wbudowanych klas Dart zwraca plikFuture gdy wywoływana jest metoda asynchroniczna.
Dart to jednowątkowy język programowania. Jeśli jakikolwiek kod blokuje wątek wykonania (na przykład czekając na czasochłonną operację lub blokując operacje we / wy), program skutecznie zawiesza się.
Operacje asynchroniczne pozwalają programowi działać bez blokowania. Dart używaFuture objects do reprezentowania operacji asynchronicznych.