如何修复“FileSystemException:异步操作当前挂起”?

老杂种*_*老杂种 6 asynchronous dart

我写了一个 torrent 下载演示,如下所示:

var peers....

for(var i =0;i < length;i++){
   var peer = peers[i];
   peer.start((List<int> data){
      _downloadFile.write(begin,end,data);
   });
}

Run Code Online (Sandbox Code Playgroud)

我的意思是有多次peer尝试访问_file.

`_downloadFile` code looks like this:
   ....
   var _access = _file.open(mode:FileMode.writeOnlyAppend);
   ...
   Future write(int begin,int end, List<int> block) async{
       ....
       await _access.setPosition(begin);
       await _access.writeFrom(block);
       ....
   }
Run Code Online (Sandbox Code Playgroud)

它会抛出异常:FileSystemException: An async operation is currently pending 我认为原因是不同的分叉调用setPosition,所以我尝试让每个分叉等待写入操作结束:

`_downloadFile` code look like this:
   ....
   var _access = _file.open(mode:FileMode.writeOnlyAppend);
   var _lock;
   ...
   Future write(int begin,int end, List<int> block) async{
       if(_lock != null) await _lock;
       var c = Completer();
       _lock = c.future;
       ....
       await _access.setPosition(begin);
       await _access.writeFrom(block);
       c.complete();
       ....
   }
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,当peer收到数据时,它会调用write方法,然后它应该等待_lock完成,但我仍然得到FileSystemException

现在我必须使用Stream, 及其pauseresume方法来避免此异常。

有人可以告诉我最后的代码有什么问题吗?为什么_lock不起作用?Dart 有“对象锁”之类的东西吗?

非常感谢!

Fle*_*exl 1

您很可能正在使用 localStorage 包并遇到此问题:https://github.com/lesnitsky/flutter_localstorage/issues/56#issuecomment-800651187

如果两个操作同时写入存储在本地存储中的文件,而第一个操作尚未完成写入,则会出现该问题。由于包没有安全性来避免并行访问同一存储,因此可能会发生这种情况并抛出错误”。

因为维护者不知何故没有认识到这个问题,所以我做了一个分叉并自己应用了更改来修复这个错误。也请随意在您的项目中使用它:-)

https://github.com/Ocell-io/flutter_localstorage