Dart 编程 - 异步

异步操作在线程中执行,独立于应用程序线程。当应用程序调用方法异步执行操作时,应用程序可以在异步方法执行其任务时继续执行。

示例

让我们举一个例子来理解这个概念。在这里,程序使用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 :     
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();  
  
    // 返回一个 futrue,这是异步方法
    f.then((data)=>print(data));
    
    // 一旦读取文件,就会调用回调方法
    print("End of main");
    // 首先打印此内容,显示 fileReading 是非阻塞还是异步
}

此程序的输出将如下所示 −

主程序结束
1, Tom
2, John
3, Tim
4, Jan

"主程序结束"首先执行,同时脚本继续读取文件。Future 类是 dart:async 的一部分,用于在异步任务完成后获取计算结果。然后,此 Future 值用于在计算完成后执行某些操作。

读取操作完成后,执行控制权将在 "then()" 内转移。这是因为读取操作可能需要更多时间,因此它不想阻止程序的其他部分。

Dart Future

Dart 社区将 Future 定义为"一种在未来某个时间获取值的方法"。简而言之,Future 对象 是一种表示表达式返回的值的机制,该表达式的执行将在稍后的时间点完成。当调用异步方法时,Dart 的几个内置类会返回 Future

Dart 是一种单线程编程语言。如果任何代码阻塞了执行线程(例如,等待耗时的操作或阻塞 I/O),程序实际上会冻结。

异步操作让您的程序运行而不会被阻塞。Dart 使用 Future 对象 来表示异步操作。