Dar 异步
一个 异步操作 从执行主应用程序线程中分出来,在一个单独线程中执行。当应用程序调用方法异步执行操作时,应用程序可以在异步方法执行其任务时继续执行。
范例
让我们举个例子来理解这个概念。这里,程序使用 IO库 接受用户输入。
import 'dart:io'; void main() { // 提示用户输入 print("请输入你的名字 :"); String name = stdin.readLineSync(); // 这是一个读取用户输入的同步方法 print("Hello Mr. ${name}"); print("End of main"); }
所述 readLineSync() 是一个同步方法。这意味着将阻止执行 readLineSync() 函数调用之后的所有指令,直到 readLineSync() 方法完成执行。
该 stdin.readLineSync 等待输入。它停在输入上,并且在收到用户的输入之前不再执行任何操作。
以上示例将产生以下输出:
请输入你的名字 : Tom // reads user input Hello Mr. Tom End of main
在计算中,我们说当某个事件在继续之前等待事件发生时,它是 同步的。这种方法的一个缺点是,如果代码的一部分花费太长时间来执行,则后续的块虽然不相关,但将被阻止执行。考虑一个必须响应多个资源请求的Web服务器。
同步执行模型将阻止每个其他用户的请求,直到它完成处理当前请求。在这种情况下,与Web服务器的情况一样,每个请求必须独立于其他请求。这意味着,Web服务器在响应其他用户的请求之前不应等待当前请求完成执行。
简而言之,在完成先前用户的请求之前,它应该接受来自新用户的请求。这被称为异步。异步编程基本上意味着没有等待或非阻塞编程模型。dart:async 包便于在dart脚本实现异步编程块。
范例
以下示例更好地说明了异步块的功能。
步骤1 - 创建 如下所示的 contact.txt 文件, 并将其保存在当前项目的数据文件夹中。
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
当脚本继续读取文件时,首先执行 main
主方法 。在Future的阶级的一部分, dart:async,用于获得一个计算的结果异步任务完成后。然后,此 Future 值用于在计算完成后执行某些操作。
一旦读取操作完成,执行控制就在 then() 内传送。这是因为读取操作可能需要更多时间,因此不希望阻止程序的其他部分。
Dart Future
Dart社区将Future定义为 “在Future的某个时间获取价值的手段”。简单地说,Future对象是一种表示由表达式返回的值的机制,该表达式的执行将在稍后的时间点完成。当调用异步方法时,Dart的几个内置类返回 Future 。
Dart是一种单线程编程语言。如果任何代码阻塞执行的线程(例如,通过等待耗时的操作或阻塞I / O),程序将有效地冻结。
异步操作可让您的程序运行而不会被阻止。Dart使用 Future对象 来表示异步操作。
下一章:Dart 并发
并发是同时执行多个指令序列。它涉及同时执行多个任务。Dart使用 Isolates作为并行工作的工具。dart:isolate是dart的解决方案,以单线程dart代码,并允许应用程序更好地利用现有的硬代码。隔离,顾名思义, ...