433 字
2 分钟
Dart 事件循环
基本概念
Dart 的事件循环是一个持续运行的程序,它管理所有的异步操作。它主要由两个队列组成:
- 微任务队列(
Microtask queue
) - 事件队列(
Event queue
)
微任务队列:
- 微任务队列用于处理优先级较高的任务。
- 通常包含由
scheduleMicrotask()
方法调度的任务。 - 微任务队列中的任务会在当前同步代码执行完毕后立即执行。
事件队列:
- 事件队列处理 I/O 事件、计时器、以及其他异步操作。
- 包含像用户输入、网络请求完成、文件 I/O 操作完成等事件。
事件循环的执行顺序:
- 执行同步代码
- 执行微任务队列中的所有任务
- 执行事件队列中的一个任务
- 重复步骤 2 和 3
代码示例:
void main() {
print('开始');
// 添加一个微任务
scheduleMicrotask(() {
print('这是一个微任务');
});
// 添加一个事件任务(使用Future)
Future(() {
print('这是一个事件任务');
});
// 添加另一个微任务
scheduleMicrotask(() {
print('这是另一个微任务');
});
print('结束');
}
这段代码的输出将会是:
开始
结束
这是一个微任务
这是另一个微任务
这是一个事件任务
解释:
- 首先执行同步代码,打印”开始”和”结束”。
- 然后执行所有微任务。
- 最后执行事件任务。
注意事项
- 不要在微任务中执行耗时操作,因为它们会阻塞事件循环。
- 使用
async
/await
可以简化异步编程,但底层仍然使用事件循环。 - Dart的单线程模型意味着长时间运行的同步操作会阻塞整个程序。