我们正在开发一个使用Xamarin和Mvvmcross的应用程序。
简单地说,我们的应用程序制作图片,将它们捆绑在一起压缩并发送到我们的服务器。 (约15张图片+一些信息文件)
它很有用,直到我们得到System.IOException:打开太多文件。
这表明我们打开了很多文件,但没有运气,我们找不到有任何打开文件的原因。
我们主要使用Xamarin和Mvvmcross插件库存。
要保存/打开/读取文件,我们使用IMvxFileStore插件,但即使我们使用.Net System.IO.File它也会这样做(抛出异常)。
一些代码:
public virtual Task<bool> SavePhoto(string name, string photoData, bool saveToLibrary = false)
{
return Task.Run(() => {
try
{
var photoPath = GetLocalPath("PHOTOS"+ "/");
if (!_fileStore.FolderExists(photoPath))
_fileStore.EnsureFolderExists(photoPath);
var filename = name;
var filePath = GetLocalPath(filename);
_fileStore.WriteFile(filePath, photoData);
if (saveToLibrary)
{
SavePhotoToLibrary(filePath);
}
return true;
}
catch (Exception ex)
{
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
return false;
}
});
}
有时它的40张照片,有时候是2张......有趣的是,重新运行的应用程序再次无济于事。 调试/发布中存在问题,甚至是不同的设备。
我们无法找到任何有助于解决此问题的主题。
有什么方法可以查看哪些文件是打开的以及在哪里? 该应用程序是否处理打开文件或系统?
答案 0 :(得分:0)
我遇到了同样错误的问题,我不得不增加ulimit。 这可能不是我想的解决方案但可能有帮助。默认情况下,OSx约为260,但我认为单声道会降低一点。在单声道中,它被称为rlimit。有一本电子书有一些解释: https://books.google.nl/books?id=FKRL5AOgiC0C&pg=PA170&lpg=PA170&dq=increase+ulimit+ios&source=bl&ots=Ti04k9RdWU&sig=XflYmYDD6UNgWka7VPkp3ZY_AWw&hl=nl&sa=X#v=onepage&q=increase%20ulimit%20ios&f=false
有关调试的说明: 我发现我们立刻向我们的api发出了太多的请求,可能是它缓存了缓存而孤立了一些任务。 FileCounter有助于确定哪些视图会产生泄漏。