- Dart 编程教程
- Dart 编程 - 首页
- Dart 编程 - 概述
- Dart 编程 - 环境
- Dart 编程 - 语法
- Dart 编程 - 数据类型
- Dart 编程 - 变量
- Dart 编程 - 运算符
- Dart 编程 - 循环
- Dart 编程 - 决策
- Dart 编程 - 数字
- Dart 编程 - 字符串
- Dart 编程 - 布尔值
- Dart 编程 - 列表
- Dart 编程 - 列表
- Dart 编程 - 映射
- Dart 编程 - 符号
- Dart 编程 - 字符符
- Dart 编程 - 枚举
- Dart 编程 - 函数
- Dart 编程 - 接口
- Dart 编程 - 类
- Dart 编程 - 对象
- Dart 编程 - 集合
- Dart 编程 - 泛型
- Dart 编程 - 包
- Dart 编程 - 异常
- Dart 编程 - 调试
- Dart 编程 - 类型定义
- Dart 编程 - 库
- Dart 编程 - 异步
- Dart 编程 - 并发
- Dart 编程 - 单元测试
- Dart 编程 - HTML DOM
- Dart 编程有用资源
- Dart 编程 - 快速指南
- Dart 编程 - 资源
- Dart 编程 - 讨论
Dart 编程 - 异步
一个异步操作在一个独立于主应用程序线程的线程中执行。当应用程序调用一个方法来异步执行一个操作时,应用程序可以在异步方法执行其任务的同时继续执行。
示例
让我们举一个例子来理解这个概念。这里,程序使用IO 库接受用户输入。
import 'dart:io'; void main() { print("Enter your name :"); // prompt for user input String name = stdin.readLineSync(); // this is a synchronous method that reads user input print("Hello Mr. ${name}"); print("End of main"); }
readLineSync()是一个同步方法。这意味着,在readLineSync()函数调用之后的所有指令的执行将被阻塞,直到readLineSync()方法完成执行。
stdin.readLineSync等待输入。它会停止执行,并且不会执行任何进一步的操作,直到它接收到用户的输入。
以上示例将产生以下输出:
Enter your name : Tom // reads user input Hello Mr. Tom End of main
在计算中,当某些东西在继续之前等待事件发生时,我们称之为同步。这种方法的一个缺点是,如果代码的一部分执行时间过长,则后续的块(即使不相关)也会被阻止执行。考虑一个必须响应对资源的多个请求的 Web 服务器。
同步执行模型将阻塞所有其他用户的请求,直到它完成当前请求的处理。在这种情况下,例如 Web 服务器,每个请求必须独立于其他请求。这意味着,Web 服务器不应该等待当前请求完成执行,然后再响应其他用户的请求。
简单来说,它应该在必要完成先前用户的请求之前接受新用户的请求。这被称为异步。异步编程基本上意味着没有等待或非阻塞编程模型。dart:async包有助于在 Dart 脚本中实现异步编程块。
示例
下面的示例更好地说明了异步块的功能。
步骤 1 - 创建一个contact.txt文件,如下所示并将其保存在当前项目的 data 文件夹中。
1, Tom 2, John 3, Tim 4, Jane
步骤 2 - 编写一个程序,该程序将在不阻塞应用程序其他部分的情况下读取文件。
import "dart:async"; import "dart:io"; void main(){ File file = new File( Directory.current.path+"\\data\\contact.txt"); Future<String> f = file.readAsString(); // returns a futrue, this is Async method f.then((data)=>print(data)); // once file is read , call back method is invoked print("End of main"); // this get printed first, showing fileReading is non blocking or async }
此程序的输出如下所示:
End of main 1, Tom 2, John 3, Tim 4, Jan
"end of main" 首先执行,而脚本继续读取文件。Future类(dart:async的一部分)用于在异步任务完成后获取计算结果。然后使用此Future值在计算完成后执行某些操作。
读取操作完成后,执行控制权将转移到"then()"中。这是因为读取操作可能需要更多时间,因此它不想阻塞程序的其他部分。
Dart Future
Dart 社区将Future定义为“一种在将来某个时间获取值的方法”。简单来说,Future 对象是一种表示由表达式返回的值的机制,该表达式的执行将在以后的某个时间点完成。Dart 的一些内置类在调用异步方法时返回Future。
Dart 是一种单线程编程语言。如果任何代码阻塞执行线程(例如,通过等待耗时操作或阻塞 I/O),则程序实际上会冻结。
异步操作允许您的程序在不发生阻塞的情况下运行。Dart 使用Future 对象来表示异步操作。