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

相关推荐
alexhilton1 小时前
2027 Android 开发者路线图:学习、面试与 AI
android·kotlin·android jetpack
灿飞屋3 小时前
Kotlin与Java虚拟机三:控制流
android·java·开发语言·后端·python·kotlin·安卓
疯华整猫4 小时前
我用 Trae 把 Android 内存账重算了一遍
android·性能优化·源码
TimeFine6 小时前
AI 编程工作流的设计:从人工判断到 AI裁判
android·ai编程
阿杰m6 小时前
Android源码第四章:Android 系统启动——App 的第一行代码从哪来?
android
疯华整猫10 小时前
混淆起初根本不是为了防破解:我用 Trae 把 Android 混淆这二十来年重跑了一遍
android·人工智能·计算机视觉
Carson带你学Android11 小时前
AI时代,你的 App 会被 Agent 这三种方式调用
android·ai编程
恋猫de小郭12 小时前
Flutter 下 AOT 一个你怎么都想不出来的 Bug ,JIT 正常的计算,在 AOT 居然算错了
android·前端·flutter
好的佩奇1 天前
Dart 之扩展方法
android·flutter·dart
三少爷的鞋1 天前
换个思路理解:非阻塞挂起
android