iT邦幫忙

0

Dart 語言入門 6: 同步與非同步

Dart 是屬於單一執行緒的程式語言,也就是說所有的程式碼都運行於同一個執行緒中,若是遇到如I/O操作或是http這種需要較長時間的操作時,將會阻礙執行緒的執行。不過可以透過Future實現非同步的開發,將Future 與 async、await 結合開發非同步程式。

同步

通過下面的例子來理解這個概念,I/O操作接受使用者輸入

mport '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'); 
}

https://ithelp.ithome.com.tw/upload/images/20200903/20121852V2Zng2QS6y.png
readLineSync()是一同步函式。它將阻止執行readLineSync()函式呼叫之後的所有指令,直到readLineSync()完成執行。
stdin.readLineSync等待輸入。它停止執行並且在收到使用者輸入之前不再執行任何操作。
由這個例子可以看出,同步執行將會導致長時間的等待,並延緩程式執行的效率。

非同步

非同步程式設計基本上意味著沒有等待或非阻塞程式的設計模型。導入 dart:async 可以實現非同步程式設計。
Future類別是屬於dart:async,定義為「在未來的某個時間獲取值的方法」。簡單地說,Future物件是一種表示由表示式回傳值的機制,該表示式的執行將在稍後的時間點完成。
舉一個讀取檔案,使用非同步的例子如下:
先做一個文字檔contact.txt 內容如下

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

開始撰寫非同步程式

void main(){ 
   var file = File( Directory.current.path+'\\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 
}

https://ithelp.ithome.com.tw/upload/images/20200903/20121852pXF24TeCKF.png

當指令碼執行時,呼叫readAsString非同步讀取檔案,因為讀取檔案操作可能需要很多時間,因此利用非同步的做法讓程式繼續執行,馬上接著印出「End of main」,之後一直等到非同步任務完成,在完成取值後才會執行then的程式內容。


尚未有邦友留言

立即登入留言