带你读《深入浅出Dart》十六、事件循环和协程机制(1)https://developer.aliyun.com/article/1348990?groupCode=tech_library
通过协程的机制,Dart 实现了非阻塞的异步编程。当遇到 await 表达式时,协程会暂停执行,并将控制权交给事件循环。一旦 Future 完成并返回结果,协程恢复执行,并继续执行 await 表达式之后的代码。
void main() { print('Start'); // 添加一个定时器事件 Timer(Duration(seconds: 2), () { print('Timer event'); }); // 添加一个 IO 事件 File('data.txt').readAsString().then((data) { print('IO event: $data'); }); // 添加一个异步任务 fetchData().then((result) { print('Async event: $result'); }); print('End');} Future fetchData() { return Future.delayed(Duration(seconds: 1), () => 'Data loaded');}
在上面的示例中,我们向事件队列中添加了一个定时器事件、一个 IO 事件和一个异步任务。在事件循环的处理过程中,定时器事件会在指定的延迟时间后触发,IO 事件会在文件读取完成后执行回调函数,异步任务会在 Future 完成后传递结果。
1.协程(Coroutine)
协程是一种轻量级的线程,它可以在程序内部进行切换,而不需要依赖操作系统的线程管理。在 Dart 中,协程的实现是通过异步函数和 await 关键字来实现的。
异步函数使用 async 关键字来标记,表示这个函数可能包含异步操作。在异步函数中,使用 await 关键字来等待一个 Future 的结果。当遇到 await 表达式时,当前
协程会暂停执行,并将控制权交给事件循环,直到 Future 完成并返回结果。
下面是一个示例代码,展示了协程的工作流程:
void main() async { print('Start'); // 异步函数中使用 await 等待 Future 的结果 var result = await fetchData(); print('Async result: $result'); print('End');} Future fetchData() { return Future.delayed(Duration(seconds: 2), () => 'Data loaded');}
在上面的示例中,main() 函数被标记为异步函数,使用 async 关键字进行标记。在异步函数中,我们使用 await 关键字等待 fetchData() 函数的结果。在等待期间,协程会暂停执行,并将控制权返回给事件循环。一旦 Future 完成并返回结果,协程恢复执行,并打印出结果。
带你读《深入浅出Dart》十六、事件循环和协程机制(3)https://developer.aliyun.com/article/1348987?groupCode=tech_library