Care este cunoștințele tale despre asincronie în Dart?
sobes.tech AI
Răspuns de la AI
Asincronitatea în Dart este implementată folosind:
-
Conceptul de "izolate" (Isolates): Procese de lucru independente, fiecare cu propria memorie. Sunt utilizate pentru executarea paralelă a sarcinilor intensive în resurse fără a bloca firul principal al interfeței utilizatorului. Comunicare între izolate se face prin porturi (ReceivePort, SendPort).
-
Cuvinte cheie
async,await:asyncmarchează o funcție care va efectua operații asincrone și va returna unFuture.awaiteste utilizat în interiorul unei funcțiiasyncpentru a aștepta finalizarea unuiFuture. Când este atins, execuția funcției este suspendată, permițând altor operații să fie executate în timp ceFuturese finalizează cu o valoare sau o eroare.
Future<String> fetchData() async { // Simulare întârziere await Future.delayed(Duration(seconds: 2)); return 'Date primite'; } void main() async { print('Început'); String result = await fetchData(); // Așteptăm finalizarea fetchData print(result); print('Sfârșit'); } -
Clasa
Future<T>: Reprezintă rezultatul unei operații asincrone care va fi disponibil în viitor.Futurepoate fi în una dintre cele trei stări:- Necompletat (uncompleted)
- Completat cu o valoare (completed with a value)
- Completat cu o eroare (completed with an error)
Gestionarea finalizării
Futurese face cuthen(),catchError(),whenComplete()sauawait. -
Clasa
Stream<T>: Reprezintă o secvență de evenimente asincrone. Este utilizată pentru procesarea fluxurilor de date, de exemplu, citirea din fișier, primirea datelor prin rețea, evenimente ale interfeței utilizatorului. Fluxul poate fi de abonare unică (single-subscription) sau multiplă (broadcast). Gestionarea evenimentelor fluxului se face culisten(),async*,yield.Stream<int> countStream(int to) async* { for (int i = 1; i <= to; i++) { await Future.delayed(Duration(seconds: 1)); yield i; // Trimiterea valorii în flux } } void main() { Stream<int> stream = countStream(3); stream.listen( (data) => print('Primite: $data'), onError: (error) => print('Eroare: $error'), onDone: () => print('Fluxul s-a terminat'), ); }
Asincronismul în Dart se bazează pe modelul "buclă de evenimente" (event loop). Thread-ul principal execută codul secvențial, dar la întâlnirea unei operații asincrone (de exemplu, await sau Future.then), aceasta este delegată la "coada de evenimente" (event queue) și continuă executarea codului următor. Când operația asincronă se finalizează, rezultatul său este trimis înapoi la "coada de evenimente". Bucla de evenimente verifică continuu "coada de evenimente" și execută sarcinile atunci când thread-ul principal este liber.