dart:io
:中的文件有许多同步和异步操作
file.deleteSync()
和file.delete()
file.readAsStringSync()
和file.readAsString()
file.writeAsBytesSync(bytes)
和file.writeAsBytes(bytes)
- 还有更多
在选择同步和异步选项时,我应该记住哪些注意事项?我似乎记得在某个地方看到过,如果无论如何都要等待同步选项完成,那么同步选项会更快(例如await file.delete()
(。但我不记得我在哪里看到的,也不记得这是不是真的。
这种方法与有什么区别吗
Future deleteFile(File file) async {
await file.delete();
print('deleted');
}
这种方法:
Future deleteFile(File file) async {
file.deleteSync();
print('deleted');
}
让我根据对问题的评论总结一个答案。纠正我的错误。
- 在
async
方法中运行代码不会使它在另一个线程上运行 - Dart是一个单线程系统
- 代码在事件循环中运行
- 无论系统是否处于异步方法中,执行长时间运行的同步任务都会阻塞系统
- 隔离是单个线程
- 如果要在另一个线程上运行任务,则需要在另一隔离线程上运行它
- 启动另一个隔离称为生成隔离
- 有一些选项可以在另一个隔离上运行任务,包括
compute
和IsolateChannel
,并编写自己的隔离通信代码 - 对于文件IO,同步版本比异步版本更快
- 对于繁重的文件IO,更喜欢异步版本,因为它们在单独的线程上工作
- 对于轻型文件IO(如
file.exists()
?(,使用同步版本是一种选择,因为它可能很快
进一步阅读
- 隔离和事件循环
- 单线镖,什么?——第1部分
- 单线镖,什么?——第2部分
- avoid_slow_async_io皮棉
sync
变体不同于async
变体,它们会停止CPU执行任何事件处理程序(如事件循环(,直到操作完成。
-
使用
sync
:void main() { final file = File('...'); Future(() => print('1')); // Adding to the event queue file.readAsBytesSync(); print('2'); }
输出:
2 1
-
使用
async
:void main() async { final file = File('...'); Future(() => print('1')); // Adding to the event queue await file.readAsBytes(); print('2'); }
输出:
1 2