非同步操作線上程中執行,與主應用程式執行緒分開。當應用程式呼叫方法非同步執行操作時,應用程式可以在非同步方法執行其任務時繼續執行。
範例
下面通過一個例子來理解這個概念。在範例程式中使用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
定義為「在未來的某個時間獲取值的手段」。簡單地說,Future
物件是一種表示由表示式返回的值的機制,該表示式的執行將在稍後的時間點完成。當呼叫非同步方法時,Dart的幾個內建類返回Future
。
Dart是一種單執行緒程式設計語言。如果程式碼阻塞執行的執行緒(例如,通過等待耗時的操作或阻塞I/O),程式將有效地凍結。
非同步操作可讓程式執行而不會被阻止。Dart使用Future
物件來表示非同步操作。