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

http://img2.58codes.com/2024/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 }

http://img2.58codes.com/2024/20121852pXF24TeCKF.png

当指令码执行时,呼叫readAsString非同步读取档案,因为读取档案操作可能需要很多时间,因此利用非同步的做法让程式继续执行,马上接着印出「End of main」,之后一直等到非同步任务完成,在完成取值后才会执行then的程式内容。


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章