Ответ
В Dart макрозадачи (macrotasks) — это задачи, которые планируются в очередь событий (event queue) и выполняются в следующих итерациях Event Loop. Они имеют более низкий приоритет, чем микрозадачи (microtasks).
Типичные примеры макрозадач:
- Обработка внешних событий: Пользовательский ввод (тапы, жесты), таймеры (
Timer.run,Future.delayed), сообщения от операционной системы. - I/O-операции: Завершение сетевого запроса, чтение/запись файла.
- Завершение Future: Коллбэк, переданный в
Future(() => ...)илиthen()(если Future еще не завершен), выполняется как макрозадача.
Порядок выполнения Event Loop:
- Выполняется синхронный код до конца.
- Обрабатывается вся очередь микрозадач (microtask queue) до опустошения.
- Берется и выполняется одна задача из очереди событий (event queue).
- Возврат к шагу 2 (проверка микрозадач).
Пример, демонстрирующий порядок:
void main() {
print('1. Start (синхронный код)');
// Помещается в очередь событий (макрозадача)
Future(() => print('4. Future (macrotask from event queue)'));
// Помещается в очередь микрозадач
scheduleMicrotask(() => print('3. Microtask'));
// Синхронный код продолжает выполняться
print('2. End (синхронный код)');
// Event Loop начнет работу после завершения main()
}
Вывод:
1. Start (синхронный код)
2. End (синхронный код)
3. Microtask
4. Future (macrotask from event queue)