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 服务器一样,每个请求都必须独立于其他请求。这意味着,网络服务器不应等待当前请求完成执行才响应其他用户的请求。

简而言之,它应该在完成以前用户的请求之前接受新用户的请求。这称为异步。异步编程基本上意味着无等待或非阻塞编程模型。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定义为“在未来某个时间获取值的一种方式”。简而言之,Future 对象是一种表示表达式返回值的机制,该表达式的执行将在稍后的时间点完成。当调用异步方法时,Dart 的几个内置类会返回Future 。

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

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