dart:io 同步与异步文件操作

Sur*_*gch 9 file async-await dart dart-io flutter

中的文件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');
}
Run Code Online (Sandbox Code Playgroud)

这个方法:

Future deleteFile(File file) async {
  file.deleteSync();
  print('deleted');
}
Run Code Online (Sandbox Code Playgroud)

Sur*_*gch 13

让我尝试根据对我的问题的评论总结一个答案。纠正我错误的地方。

\n\n
    \n
  • 在一个中运行代码async不会使其在另一个线程上运行。
  • \n
  • Dart 是一个单线程系统。
  • \n
  • 代码在事件循环上运行。
  • \n
  • 执行长时间运行的同步任务将阻塞系统,无论它是否在异步方法中。
  • \n
  • 隔离是单个线程。
  • \n
  • 如果您想在另一个线程上运行任务,那么您需要在另一个隔离上运行它。
  • \n
  • 启动另一个隔离群称为生成隔离群。
  • \n
  • 有一些选项可用于在另一个隔离上运行任务,包括compute编写IsolateChannel自己的隔离通信代码
  • \n
  • 对于文件 IO,同步版本比异步版本更快。
  • \n
  • 对于繁重的文件 IO,更喜欢异步版本,因为它们在单独的线程上工作
  • \n
  • 对于轻量文件 IO(如file.exists()?),使用同步版本是一种选择,因为它可能会很快。
  • \n
\n\n

进一步阅读

\n\n\n