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



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是一个单线程系统
  • 代码在事件循环中运行
  • 无论系统是否处于异步方法中,执行长时间运行的同步任务都会阻塞系统
  • 隔离是单个线程
  • 如果要在另一个线程上运行任务,则需要在另一隔离线程上运行它
  • 启动另一个隔离称为生成隔离
  • 有一些选项可以在另一个隔离上运行任务,包括computeIsolateChannel,并编写自己的隔离通信代码
  • 对于文件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
    

最新更新