非同步操作線上程中執行,與主應用程式線程分開。當應用程式調用方法非同步執行操作時,應用程式可以在非同步方法執行其任務時繼續執行。
示例
下麵通過一個例子來理解這個概念。在示例程式中使用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
對象來表示非同步操作。