开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情
前言
众所周知,Dart是一个在单线程语言,这意味着:如果Dart程序在执行中遇到一个需要长时间的执行的操作,程序将会被卡死。
为了避免造成程序的卡死,可以使用异步操作使程序在等待一个耗时操作完成时继续处理其他工作。
在Dart中,可以使用Future对象来表示异步操作的结果。当然,我们本文章先介绍Dart的事件循环机制。
正文
1.Dart事件循环机制概览
说到Future异步,不得不说的就是Dart的事件循环机制(even loop)。要了解清楚了以后,我们才能对Future有一个更深刻的认识。
如上图所示,我们可以看出以下:
- Dart的事件主要是分配到了两个队列中进行执行:
Event队列和Microtask队列。 - Dart的方法是一个循环(loop),不断地执行图中的两个判断以及对应的逻辑,当
main()执行完成后,main isolate的线程就会去逐一处理消息队列中的消息。
2.Microtask队列
Microtask队列的所有消息只来自Dart内部,在整个Dart事件循环中,DartVM会优先处理微任务队列,Microtask清空之后才将Event事件队列中的下一个项目出队并处理。一旦两个队列都为空,则应用程序已完成工作,并且可以退出(取决于程序)。
3.Event队列是什么
事件队列具有来自Dart(Future,Timer,Isolate Message等)和系统(用户输入,I/O等);
Dart主线程(main isolate)会不断得从这个Event队列中取出消息,然后执行。
总结
当要安排一个任务时,如果可以,尽量将任务放入Event队列中。即使用Future。
可以使用Future的then方法或whenComplete方法来指定任务顺序。为了保持程序不会出现卡死,不要将大计算量的任务放入UI 线程中(即 main isolate)。大计算量的任务放入其他的专门负责计算的isolate中。