异步操作在与 main 应用程序线程分开的线程中执行,当应用程序调用方法以异步执行操作时,该应用程序可以在异步方法执行其任务的同时继续执行。
让我们举一个示例来理解这个概念。在此,程序使用 IO库接受用户输入。
import 'dart:io'; void main() { print("Enter your name :"); //提示用户输入 String name=stdin.readLineSync(); //这是一个读取用户输入的同步方法 print("Hello Mr. ${name}"); print("End of main"); }
readLineSync() 是一种同步方法,这意味着在 readLineSync()方法完成执行之前,将阻止执行 readLineSync()之后的所有指令。
stdin.readLineSync 等待输入,直到收到用户输入后才执行。
上面的示例将导致以下输出 -
Enter your name : Learnfk //reads user input Hello Mr. Learnfk End of main
简而言之,在必须完成先前用户的请求之前,它应该接受新用户的请求,这称为异步,异步编程基本上意味着没有等待或无阻塞的编程模型, dart:async 包有助于在Dart脚本中实现异步编程块。
Async - 示例
以下示例更好地说明了异步块的函数。
步骤1 - 按照所示创建 contact.txt 文件,并将其保存在当前项目的数据文件夹中。
1, Learnfk 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, Learnfk 2, John 3, Tim 4, Jan
在脚本继续读取文件的同时,首先执行" main of end",dut:async 的一部分 Future 类用于在异步任务完成后获取计算输出,然后,该 Future 值将在计算完成后用于执行某些操作。
读取操作完成后,将在" then()" 中转移执行控制,这是因为读取操作可能会花费更多时间,所以它不想阻塞程序的其他部分。
Async - Dart Future
Dart社区将 Future 定义为"一种在将来某个时候获得价值的手段"。简而言之,Future对象是一种表示表达式返回值的机制,该表达式的执行将在以后的某个时间点完成,当调用异步方法时,Dart的多个内置类将返回 Future 。
Dart是一种单线程编程语言,如果有任何代码阻塞了执行线程(如,通过等待耗时的操作或阻塞了I/O),则程序将有效冻结。
异步操作使您的程序运行而不会被阻塞, Dart使用Future 对象表示异步操作。
参考链接
https://www.learnfk.com/dart-programming/dart-programming-async.html