Sobes.tech
Middle+

Leg uit hoe de Event Loop werkt in de context van de Dart-taal en het Flutter-framework.

sobes.tech AI

Antwoord van AI

Dart is single-threaded, maar gebruikt de Event Loop om asynchrone operaties te beheren.

De Event Loop bestaat uit twee hoofdwachtrijen:

  1. Microtask Queue: voor high-priority, korte asynchrone taken. Ze worden direct uitgevoerd na het voltooien van de huidige operatie en vóór de volgende iteratie van de Event Loop.
  2. Event Queue: voor externe gebeurtenissen (zoals I/O, timers, gebruikersinvoer). Taken uit deze wachtrij worden verwerkt nadat de Microtask Queue leeg is.

Werking:

  • De hoofdthread voert synchrone code uit.
  • Wanneer een asynchrone operatie wordt aangetroffen (bijvoorbeeld Future, Stream, timer), wordt deze geregistreerd en naar de juiste wachtrij gestuurd.
  • De Event Loop controleert voortdurend de Microtask Queue. Als deze niet leeg is, worden de taken ervan uitgevoerd totdat deze leeg is.
  • Vervolgens controleert de Event Loop de Event Queue. Als deze niet leeg is, wordt de eerste taak genomen en uitgevoerd.
  • Deze cyclus herhaalt zich totdat beide wachtrijen leeg zijn en er geen asynchrone operaties meer wachten.

Voorbeeld van gebruik van Future en scheduleMicrotask:

void main() {
  print('1. Begin main');

  // Voegt een microtask toe aan de Microtask Queue
  scheduleMicrotask(() {
    print('3. Microtask wordt uitgevoerd');
  });

  // Creëert een asynchrone operatie die na voltooiing wordt toegevoegd aan de Event Queue
  Future(() {
    print('4. Future wordt uitgevoerd (uit de Event Queue)');
  });

  // Voegt nog een microtask toe
  scheduleMicrotask(() {
    print('5. Tweede microtask wordt uitgevoerd');
  });

  // Creëert een Future met vertraging, ook naar de Event Queue gestuurd
  Future.delayed(Duration(milliseconds: 10), () {
    print('6. Vertraagde Future wordt uitgevoerd (uit de Event Queue)');
  });

  print('2. Einde main');
}

// Verwachte uitvoer:
// 1. Begin main
// 2. Einde main
// 3. Microtask wordt uitgevoerd
// 5. Tweede microtask wordt uitgevoerd
// 4. Future wordt uitgevoerd (uit de Event Queue)
// 6. Vertraagde Future wordt uitgevoerd (uit de Event Queue)

In Flutter beheert de Event Loop het uitvoeren van UI-taken (zoals het opnieuw tekenen van widgets), het verwerken van gebaren, netwerkverzoeken en andere asynchrone operaties, waardoor de app soepel blijft werken zonder de UI te blokkeren. Belangrijke Flutter-taken (zoals het plannen van frames voor rendering) maken vaak gebruik van de Microtask Queue om hogere prioriteit te bereiken.