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

相关推荐
故事与他6453 小时前
Thinkphp(TP)框架漏洞攻略
android·服务器·网络·中间件·tomcat
每次的天空5 小时前
项目总结:GetX + Kotlin 协程实现跨端音乐播放实时同步
android·开发语言·kotlin
m0_748233177 小时前
SQL之delete、truncate和drop区别
android·数据库·sql
书弋江山7 小时前
flutter 自定义控件RenderObjectWidget使用
前端·javascript·flutter
CYRUS_STUDIO8 小时前
OLLVM 增加 C&C++ 字符串加密功能
android·c++·安全
帅次10 小时前
Flutter 输入组件 Radio 详解
android·flutter·ios·kotlin·android studio
&有梦想的咸鱼&11 小时前
Android Compose 框架的状态与 ViewModel 的协同(collectAsState)深入剖析(二十一)
android
开开心心就好11 小时前
高效PDF翻译解决方案:多引擎支持+格式零丢失
android·java·网络协议·tcp/ip·macos·智能手机·pdf
路上阡陌12 小时前
docker 安装部署 canal
android·adb·docker
&有梦想的咸鱼&13 小时前
入剖析 Android Compose 框架的关键帧动画(keyframes、Animatable)(二十三)
android