带你读《深入浅出Dart》十六、事件循环和协程机制(2)https://developer.aliyun.com/article/1348989?groupCode=tech_library
4.宏任务队列(Macrotask Queue))
在 Dart 中,宏任务(Macrotask)是指需要在事件循环的下一轮执行的任务。与微任务不同,宏任务的执行发生在微任务队列处理完毕后。以下是一些常见的宏任务:
1) 定时器事件
通过 Timer 类创建的定时器事件是宏任务。可以使用 Timer 类的方法(如 Timer.run()、Timer.periodic()、Timer(Duration, callback))来创建定时器事件,并在指定的延迟时间后执行回调函数。
void main() { print('Start'); Timer(Duration(seconds: 2), () { print('Timer event'); }); print('End');}
在上面的示例中,通过 Timer 类创建的定时器事件会在指定的延迟时间后作为宏任务执行。
2) IO 事件
包括文件读写、网络请求等异步操作。当执行这些异步操作时,相应的 IO 事件会被触发,然后作为宏任务在事件循环的下一轮执行。
import 'dart:io'; void main() { print('Start'); File('data.txt').readAsString().then((data) { print('IO event: $data'); }); print('End');}
在上面的示例中,文件读取的 IO 事件会在文件读取完成后作为宏任务执行。
3) UI 事件
在 Flutter 应用程序中,用户交互(如点击按钮、滑动屏幕等)触发的事件也是宏任务。这些 UI 事件会被放入事件队列,并在事件循环的下一轮执行。
import 'package:flutter/material.dart'; void main() { runApp(MyApp());} class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Macrotask Example'), ), body: Center( child: RaisedButton( child: Text('Click Me'), onPressed: () { print('Button clicked'); }, ), ), ), ); }}
在上面的示例中,按钮点击事件会在事件循环的下一轮作为宏任务执行。
宏任务与微任务相对,宏任务的执行顺序在微任务之后。在事件循环的每一轮中,首先会处理微任务队列中的所有微任务,然后才会执行宏任务。
通过宏任务,我们可以在 Dart 中处理一些需要在下一轮事件循环执行的任务,例如定时器事件、IO 事件和用户交互事件。这使得我们可以在合适的时机执行这些任务,并保持事件循环的稳定性和性能。
带你读《深入浅出Dart》十六、事件循环和协程机制(4)https://developer.aliyun.com/article/1348986?groupCode=tech_library