Dart异步编程:一、认识任务

前言

任务就像是程序里的一个个小包裹,每个包裹都有自己的内容和去向。比如,当你在手机应用里点击一个按钮去获取网络数据,这个获取数据的操作就是一个任务。它有自己的起点(你点击按钮的时候),过程(网络传输数据),和终点(数据到达你的手机)。

在Dart里,任务被定义为一个独立的工作单元,它可以是一个简单的计算,也可以是一个复杂的网络请求。任务可以被并发或者并行执行,这意味着在合适的条件下,多个任务可以同时进行,从而提高程序的效率。

基础概念

Dart中的任务主要分为同步任务微任务事件任务I/O回调任务渲染任务

1. 同步任务

同步任务就像是你直接去商店买东西,买完就走,不会等待其他事情完成。它会直接在当前线程中执行,直到完成为止。

dart 复制代码
void syncTask() {
  print("同步任务开始");
  // 同步操作
  print("同步任务结束");
}

2. 微任务

微任务则像是你提前预约的服务,它会在所有同步任务完成后第一时间处理。微任务具有最高的优先级,适用于需要立即执行的异步操作。

dart 复制代码
void scheduleMicrotaskExample() {
  scheduleMicrotask(() {
    print("微任务执行");
  });
}

3. 事件任务

事件任务和I/O回调任务则更像是你打电话预约,等对方准备好后再来处理。事件任务是标准优先级的异步任务(优先级比微任务低)。

dart 复制代码
Future<void> eventTask() async {
  print("事件任务开始");
  // 模拟异步操作
  await Future.delayed(Duration(seconds: 1));
  print("事件任务结束");
}

4. I/O回调任务

I/O回调任务是由系统事件触发的任务,例如文件读取完成后的回调。

dart 复制代码
void ioCallbackTask() {
  File("example.txt").readAsString().then((String contents) {
    print("I/O回调任务完成,文件内容为:$contents");
  });
}

5. 渲染任务

渲染任务则是在特定的时间点,比如屏幕刷新的时候,来更新界面。

dart 复制代码
void renderTask() {
  WidgetsBinding.instance.scheduleFrame();
}

任务的调度与管理

任务的调度就像是一个交通指挥官,决定着哪个任务先执行,哪个任务后执行。常见的调度策略有先来先服务、轮转调度和优先级调度。在Dart里,任务的调度主要通过事件循环来实现,它就像是一个永不停歇的邮递员,不断地从任务队列里取出任务并执行。

代码示例:

dart 复制代码
void eventLoopExample() {
  print("主线程开始");

  // 微任务
  scheduleMicrotask(() {
    print("微任务1");
  });

  // 异步任务
  Future.delayed(Duration(seconds: 0), () {
    print("异步任务1");
  });

  // 再次添加微任务
  scheduleMicrotask(() {
    print("微任务2");
  });

  print("主线程结束");
}

//输出结果:
主线程开始
主线程结束
微任务1
微任务2
异步任务1

事件循环的执行顺序

在 Dart 的事件循环中,执行顺序如下:

  1. 同步代码:首先执行所有同步代码。
  2. 微任务队列:然后依次执行微任务队列中的所有微任务。
  3. 事件队列:最后执行事件队列中的异步任务。

同步与异步的区别

同步就像是你排队买奶茶,必须站在那里等奶茶做好才能离开,整个过程是顺序的,不能做其他事情。而异步则像是你扫码点奶茶,点完后可以去做其他事情,奶茶做好后会通知你来取。在Dart里,同步任务会阻塞后续代码的执行,而异步任务则不会,它可以让程序在等待某个任务完成的同时继续执行其他代码。

同步与异步示例

dart 复制代码
// 同步示例
void synchronousExample() {
  print("同步操作开始");
  // 模拟耗时操作
  for (var i = 0; i < 100000000; i++) {}
  print("同步操作结束");
}

// 异步示例
void asynchronousExample() async {
  print("异步操作开始");
  // 模拟异步耗时操作
  await Future.delayed(Duration(seconds: 2));
  print("异步操作结束");
}

异步编程的优势

异步编程的优势在于它能够提高程序的效率和响应速度。比如在处理网络请求时,如果使用同步方式,程序会一直等待网络数据返回,期间无法执行其他操作。而使用异步方式,程序可以在等待数据的同时继续处理其他任务,当数据返回时再通过回调函数来处理结果。

任务的生命周期

任务的生命周期通常包括以下几个阶段:

  1. 创建(Created) : 任务被定义或创建,但尚未开始执行。

  2. 等待(Pending) :任务已经准备好,等待执行。

  3. 运行中(Running) :任务正在执行中。

  4. 完成(Completed) :任务

在 Dart 中,异步任务的生命周期可以通过 Future 的状态来理解。以下是任务生命周期的流程图描述:

八、总结

在 Dart 中,任务分为同步任务、微任务、事件任务、I/O 回调任务和渲染任务,它们通过事件循环进行调度,顺序为先执行同步代码,再依次执行微任务队列和事件队列中的任务,其中异步编程能提高程序效率和响应速度,任务从创建到完成会经历创建、等待、运行中和完成四个阶段。

相关推荐
鸿蒙布道师3 小时前
鸿蒙NEXT开发动画案例2
android·ios·华为·harmonyos·鸿蒙系统·arkui·huawei
androidwork3 小时前
Kotlin Android工程Mock数据方法总结
android·开发语言·kotlin
xiangxiongfly9155 小时前
Android setContentView()源码分析
android·setcontentview
人间有清欢7 小时前
Android开发补充内容
android·okhttp·rxjava·retrofit·hilt·jetpack compose
人间有清欢7 小时前
Android开发报错解决
android
每次的天空9 小时前
Android学习总结之kotlin协程面试篇
android·学习·kotlin
每次的天空11 小时前
Android学习总结之Binder篇
android·学习·binder
峥嵘life11 小时前
Android 有线网开发调试总结
android
是店小二呀12 小时前
【算法-链表】链表操作技巧:常见算法
android·c++·算法·链表
zhifanxu13 小时前
Kotlin 遍历
android·开发语言·kotlin