
- Dart 程式設計教程
- Dart 程式設計 - 首頁
- Dart 程式設計 - 概述
- Dart 程式設計 - 環境
- Dart 程式設計 - 語法
- Dart 程式設計 - 資料型別
- Dart 程式設計 - 變數
- Dart 程式設計 - 運算子
- Dart 程式設計 - 迴圈
- Dart 程式設計 - 決策
- Dart 程式設計 - 數字
- Dart 程式設計 - 字串
- Dart 程式設計 - 布林值
- Dart 程式設計 - 列表
- Dart 程式設計 - 列表
- Dart 程式設計 - 對映
- Dart 程式設計 - 符號
- Dart 程式設計 - 字元符
- Dart 程式設計 - 列舉
- Dart 程式設計 - 函式
- Dart 程式設計 - 介面
- Dart 程式設計 - 類
- Dart 程式設計 - 物件
- Dart 程式設計 - 集合
- Dart 程式設計 - 泛型
- Dart 程式設計 - 包
- Dart 程式設計 - 異常
- Dart 程式設計 - 除錯
- Dart 程式設計 - 型別定義
- Dart 程式設計 - 庫
- Dart 程式設計 - 非同步
- Dart 程式設計 - 併發
- Dart 程式設計 - 單元測試
- Dart 程式設計 - HTML DOM
- Dart 程式設計有用資源
- Dart 程式設計 - 快速指南
- Dart 程式設計 - 資源
- Dart 程式設計 - 討論
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 物件來表示非同步操作。