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 伺服器。

同步執行模型將阻塞所有其他使用者的請求,直到它完成當前請求的處理。在這種情況下,例如 Web 伺服器,每個請求必須獨立於其他請求。這意味著,Web 伺服器不應該等待當前請求完成執行,然後再響應其他使用者的請求。

簡單來說,它應該在必要完成先前使用者的請求之前接受新使用者的請求。這被稱為非同步。非同步程式設計基本上意味著沒有等待或非阻塞程式設計模型。dart:async包有助於在 Dart 指令碼中實現非同步程式設計塊。

示例

下面的示例更好地說明了非同步塊的功能。

步驟 1 - 建立一個contact.txt檔案,如下所示將其儲存在當前專案的 data 資料夾中。

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

"end of main" 首先執行,而指令碼繼續讀取檔案。Future類(dart:async的一部分)用於在非同步任務完成後獲取計算結果。然後使用此Future值在計算完成後執行某些操作。

讀取操作完成後,執行控制權將轉移到"then()"中。這是因為讀取操作可能需要更多時間,因此它不想阻塞程式的其他部分。

Dart Future

Dart 社群將Future定義為“一種在將來某個時間獲取值的方法”。簡單來說,Future 物件是一種表示由表示式返回的值的機制,該表示式的執行將在以後的某個時間點完成。Dart 的一些內建類在呼叫非同步方法時返回Future

Dart 是一種單執行緒程式語言。如果任何程式碼阻塞執行執行緒(例如,透過等待耗時操作或阻塞 I/O),則程式實際上會凍結。

非同步操作允許您的程式在不發生阻塞的情況下執行。Dart 使用Future 物件來表示非同步操作。

廣告