Middle+
Selgitage, kuidas töötab Event Loop Dart keele ja Flutter raamistikus.
sobes.tech AI
Vastus AI-lt
Dart on ühekordne, kuid kasutab asünkroonsete operatsioonide töötlemiseks Event Loop.
Event Loop koosneb kahest peamisest järjekorrast:
- Microtask Queue: kõrge prioriteediga, lühikesed asünkroonsed ülesanded. Need täidetakse kohe pärast praeguse operatsiooni lõppu ja enne järgmise tsükli algust.
- Event Queue: välised sündmused (näiteks I/O, ajastid, kasutaja sisend). Selle järjekorra ülesanded täidetakse pärast seda, kui Microtask Queue on tühi.
Tööprotsess:
- Peamine voog täidab sünkroonilist koodi.
- Kui kohtutakse asünkroonse operatsiooniga (nt
Future,Stream, ajastaja), see registreeritakse ja saadetakse vastavasse järjekorda. - Event Loop kontrollib pidevalt Microtask Queue-d. Kui see ei ole tühi, täidetakse ülesanded sellest kuni täieliku tühjendamiseni.
- Seejärel kontrollib Event Loop Event Queue-d. Kui see ei ole tühi, võetakse esimene ülesanne ja täidetakse.
- See tsükkel kordub, kuni mõlemad järjekorrad on tühjad ja ootejärjekorras ei ole asünkroonseid operatsioone.
Näide kasutades Future ja scheduleMicrotask:
void main() {
print('1. Peamine algas');
// Lisab mikroülesande Microtask Queue-sse
scheduleMicrotask(() {
print('3. Mikroülesanne täidetud');
});
// Loob asünkroonse operatsiooni, mis lisatakse Event Queue-sse pärast selle lõpetamist
Future(() {
print('4. Future täidetud (Event Queue-st)');
});
// Lisab teise mikroülesande
scheduleMicrotask(() {
print('5. Teine mikroülesanne täidetud');
});
// Loob viibiva Future, mis samuti saadetakse Event Queue-sse
Future.delayed(Duration(milliseconds: 10), () {
print('6. Viivitatud Future täidetud (Event Queue-st)');
});
print('2. Peamine lõppes');
}
// Oodatav täitmise järjekord:
// 1. Peamine algas
// 2. Peamine lõppes
// 3. Mikroülesanne täidetud
// 5. Teine mikroülesanne täidetud
// 4. Future täidetud (Event Queue-st)
// 6. Viivitatud Future täidetud (Event Queue-st)
Flutteris kontrollib Event Loop UI ülesannete täitmist (widgetide uuesti joonistamine), žestide töötlemist, võrgupäringuid ja muid asünkroonseid operatsioone, tagades sujuva rakenduse tööd ilma UI blokeerimiseta. Olulised Flutteri ülesanded (näiteks kaadripõhine renderdamise planeerimine) kasutavad sageli Microtask Queue'd kõrgema prioriteedi saavutamiseks.