Ποια είναι η γνώση σας σχετικά με την ασυγχρονία στο Dart;
sobes.tech AI
Απάντηση από AI
Η ασυγχρονία στο Dart υλοποιείται με:
-
Η έννοια των "απομονωτών" (Isolates): Ανεξάρτητα εργασιακά διαδικασίες, η καθεμία με τη δική της μνήμη. Χρησιμοποιούνται για την παράλληλη εκτέλεση εργασιών που απαιτούν πόρους, χωρίς να μπλοκάρουν το κύριο νήμα της διεπαφής χρήστη. Η επικοινωνία μεταξύ απομονωτών γίνεται μέσω θυρών (ReceivePort, SendPort).
-
Λέξεις-κλειδιά
async,await:asyncσηματοδοτεί μια λειτουργία που θα εκτελεί ασύγχρονες λειτουργίες και θα επιστρέφει έναFuture.awaitχρησιμοποιείται μέσα σε μιαasyncλειτουργία για να περιμένει την ολοκλήρωση ενόςFuture. Όταν φτάσει, η εκτέλεση της λειτουργίας διακόπτεται, επιτρέποντας σε άλλες λειτουργίες να εκτελεστούν, ενώ τοFutureολοκληρώνεται με μια τιμή ή σφάλμα.
Future<String> fetchData() async { // Προσομοίωση καθυστέρησης await Future.delayed(Duration(seconds: 2)); return 'Δεδομένα λήφθηκαν'; } void main() async { print('Αρχή'); String result = await fetchData(); // Περιμένουμε την ολοκλήρωση του fetchData print(result); print('Τέλος'); } -
Η κλάση
Future<T>: Αντιπροσωπεύει το αποτέλεσμα μιας ασύγχρονης λειτουργίας που θα είναι διαθέσιμο στο μέλλον. ΤοFutureμπορεί να βρίσκεται σε μία από τρεις καταστάσεις:- Μη ολοκληρωμένο (uncompleted)
- Ολοκληρωμένο με μια τιμή (completed with a value)
- Ολοκληρωμένο με σφάλμα (completed with an error)
Η διαχείριση της ολοκλήρωσης του
Futureγίνεται μεthen(),catchError(),whenComplete()ήawait. -
Η κλάση
Stream<T>: Αντιπροσωπεύει μια ακολουθία ασύγχρονων γεγονότων. Χρησιμοποιείται για την επεξεργασία ροών δεδομένων, π.χ., ανάγνωση από αρχείο, λήψη δεδομένων μέσω δικτύου, γεγονότα διεπαφής χρήστη. Η ροή μπορεί να είναι με μία μόνο εγγραφή (single-subscription) ή πολλαπλές εγγραφές (broadcast). Η επεξεργασία γεγονότων της ροής γίνεται μεlisten(),async*,yield.Stream<int> countStream(int to) async* { for (int i = 1; i <= to; i++) { await Future.delayed(Duration(seconds: 1)); yield i; // Αποστολή τιμής στη ροή } } void main() { Stream<int> stream = countStream(3); stream.listen( (data) => print('Λήφθηκε: $data'), onError: (error) => print('Σφάλμα: $error'), onDone: () => print('Η ροή ολοκληρώθηκε'), ); }
Η ασυγχρονία στο Dart βασίζεται στο μοντέλο "βρόχο γεγονότων" (event loop). Το κύριο νήμα εκτελεί τον κώδικα με σειριακή σειρά, αλλά όταν συναντά μια ασύγχρονη λειτουργία (π.χ., await ή Future.then), την αναθέτει στη "στοίβα γεγονότων" (event queue) και συνεχίζει την εκτέλεση του επόμενου κώδικα. Όταν η ασύγχρονη λειτουργία ολοκληρωθεί, το αποτέλεσμα της επιστρέφεται πίσω στη "στοίβα γεγονότων". Ο βρόχος γεγονότων ελέγχει συνεχώς τη "στοίβα γεγονότων" και εκτελεί εργασίες όταν το κύριο νήμα είναι ελεύθερο.