Dart的消息循环和消息队列

一个Dart应用有一个消息循环和两个消息队列-- event队列microtask队列

event队列包含所有外来的事件:I/O,mouse events,drawing events,timers,isolate之间的message等。

microtask 队列在Dart中是必要的,因为有时候事件处理想要在稍后完成一些任务但又希望是在执行下一个事件消息之前。

event队列包含Dart和来自系统其它位置的事件。但microtask队列只包含来自当前isolate的内部代码。

正如下面的流程图,当main方法退出后,event循环就开始它的工作。首先它会以FIFO的顺序执行micro task,当所有micro task执行完后它会从event 队列中取事件并执行。如此反复,直到两个队列都为空。


Dart的消息循环和消息队列_第1张图片

注意:当事件循环正在处理micro task的时候。event队列会被堵塞。这时候app就无法进行UI绘制,响应鼠标事件和I/O等事件

虽然你可以预测任务执行的顺序,但你无法准确的预测到事件循环何时会处理你期望的任务。例如当你创建一个延时1s的任务,但在排在你之前的任务结束前事件循环是不会处理这个延时任务的,也就是或任务执行可能是大于1s的。

// 明确表现出了后者依赖前者设置的变量值

future.then(...setan important variable...) .then((_) {...use the important variable...});

为了表示明确的前后依赖关系,我们可以使用then()来表明要使用变量就必须要等设置完这个变量。这里可以使用whenComplete()来代替then,它与then的不同点在于哪怕设置变量出现了异常也会被调用到。这个有点像java中的finally。

当你需要指定一些代码稍后运行的时候,你可以使用dart:async提供的两种方式:

1.Future类,它可以向event队列的尾部添加一个事件。

2.使用顶级方法**scheduleMicrotask()**,它可以向microtask队列的尾部添加一个微任务。

以下有几点关于dart的事件循环机制需要牢记于心:

1.Dart事件循环执行两个队列里的事件:event队列和microtask队列。

2.event队列的事件来自dart(future,timer,isolate message等)和系统(用户输入,I/O等)。

3.目前为止,microtask队列的事件只来自dart。

4.事件循环会优先清空microtask队列,然后才会去处理event队列。

5.当两个队列都清空后,dart就会退出。

6.main方法,来自event队列和microtask队列的所有事件都运行在Dart的main isolate中。

当你要安排一个任务时,请遵守以下规则:

1.如果可以,尽量将任务放入event队列中。

2.使用Future的then方法或whenComplete方法来指定任务顺序。

3.为了保持你app的可响应性,尽量不要将大计算量的任务放入这两个队列。

4.大计算量的任务放入额外的isolate中。

你可能感兴趣的:(Dart的消息循环和消息队列)