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對象來表示非同步操作。


上一篇: Dart庫 下一篇: Dart併發