Xamarin.ios 打开的文件太多

Xamarin.ios too many files open

我们正在使用 Xamarin 和 Mvvmcross 开发应用程序。

简而言之,我们的应用程序制作图片,将它们打包成一个 zip 文件并发送到我们的服务器。 (约15张图片+一些信息文件)

在我们得到 System.IOException 之前一直很好用:打开的文件太多。

这表明我们打开了很多文件,但运气不好,我们找不到打开文件的原因。

我们主要使用常用的 Xamarin 和 Mvvmcross 插件。

对于 save/open/read 文件,我们使用 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 张照片...有趣的是再次重新运行应用程序并没有多大帮助。 debug/release 甚至不同的设备都存在问题。

我们无法找到任何有助于解决此问题的主题。

有没有什么方法可以查看打开了哪些文件以及打开了哪些文件? 应用程序是否处理打开文件或系统?

我 运行 遇到了同样错误的问题,我不得不增加 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 有助于确定哪些视图会产生泄漏。