📜  Dart编程-异步

📅  最后修改于: 2020-11-05 04:26:34             🧑  作者: Mango


异步操作在与应用程序线程分开的线程中执行。当应用程序调用方法以异步执行操作时,该应用程序可以在异步方法执行其任务的同时继续执行。

让我们举一个例子来理解这个概念。在此,程序使用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文件并将其保存在当前项目的数据文件夹中。

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 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 of end”。 Future类是dart:async的一部分,用于在异步任务完成后获取计算结果。然后,此Future值将在计算完成后用于执行某些操作。

一旦读取操作完成,执行控制将在“ then()”中转移。这是因为读取操作可能会花费更多时间,所以它不想阻塞程序的其他部分。

飞镖未来

Dart社区将Future定义为“一种在将来某个时候获得价值的手段”。简而言之, Future对象是一种表示表达式返回值的机制,该表达式的执行将在以后的某个时间点完成。当调用异步方法时,Dart的多个内置类将返回Future

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

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