我写了一个 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, 及其pause和resume方法来避免此异常。
有人可以告诉我最后的代码有什么问题吗?为什么_lock不起作用?Dart 有“对象锁”之类的东西吗?
非常感谢!
您很可能正在使用 localStorage 包并遇到此问题:https://github.com/lesnitsky/flutter_localstorage/issues/56#issuecomment-800651187
如果两个操作同时写入存储在本地存储中的文件,而第一个操作尚未完成写入,则会出现该问题。由于包没有安全性来避免并行访问同一存储,因此可能会发生这种情况并抛出错误”。
因为维护者不知何故没有认识到这个问题,所以我做了一个分叉并自己应用了更改来修复这个错误。也请随意在您的项目中使用它:-)
https://github.com/Ocell-io/flutter_localstorage
| 归档时间: |
|
| 查看次数: |
3689 次 |
| 最近记录: |