详细认识 Dart 异步编程(三)


没有异步编程基础的人,需要看两篇前置文章:

本篇文章详细说明异步编程,了解异步执行于正常执行的任务的区别。

非异步(非阻塞)任务执行被主线程由顺序执行,然而,异步(阻塞)任务将在未来的某个时间执行。

异步任务之后的所有非异步任务都要等待异步任务执行完成之后再执行。下面,用实际案例说明这两者的区别:

void main() {
  // waitFuture 函数是一个异步函数,阻塞会发生在函数内部
  waitFuture();
  // 第 5 行的任务不是异步的任务,线程会直接执行,不等待。
  print('The normal task was completed by main thread.');
}

// 加了一个async之后,就是一个异步函数,异步函数里面的所有任务都是阻塞的。
void waitFuture() async {
  print('The future task begins to start.');
  // 任务开始等待
  await Future.delayed(Duration(seconds: 2));
  // 前面有一个 await 的任务,等待上一个任务执行完擦执行下一步
  print('Wait for future task to complete.');
}

waitFuture函数标记了关键字async,代表该函数是一个异步函数。在函数内,处于异步任务之前的所有非异步任务不会受影响而按照顺序执行。但是,处于异步任务之后的所有非异步任务都必须等待异步任务完成之后才可以执行。

print('Wait for future task to complete.');的执行必须要等待await Future.delayed(Duration(seconds: 2));才可以被执行。然而,函数内的print('The future task begins to start.');会被执行,这是因为它在异步任务之前,所以会首先被执行。

main函数中,print('The normal task was completed by main thread.');不会受异步函数waitFuture影响,而是按照顺序执行。

所以,这三个句子的打印顺序就是:

  1. The future task begins to start.
  2. The normal task was completed by main thread.
  3. Wait for future task to complete.