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 :     
Maxsu                   

// reads user input  
Hello Mr. Maxsu 
End of main

在計算中,當某個事件在繼續之前等待事件發生時,它是同步的。這種方法的一個缺點是,如果程式碼的一部分花費太長時間來執行,則後續的塊雖然不相關,但會阻止暫停執行。考慮一個必須響應多個資源請求的Web伺服器。

同步執行模型將阻止每個其他使用者的請求,直到它完成當前請求的處理。在這種情況下,與Web伺服器的情況一樣,每個請求必須獨立於其他請求。Web伺服器在響應其他使用者的請求之前不應等待當前請求完成執行。

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

範例

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

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

1, One 
2, Two 
3, Three 
4, Four

第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, One 
2, Two 
3, Three 
4, Four

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

當讀取操作完成,執行控制就在then()內傳送。這是因為讀取操作可能需要更多時間,因此不希望阻止程式的其他部分。

Dart Future

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

Dart是一種單執行緒程式設計語言。如果程式碼阻塞執行的執行緒(例如,通過等待耗時的操作或阻塞I/O),程式將有效地凍結。

非同步操作可讓程式執行而不會被阻止。Dart使用Future物件來表示非同步操作。