Xamarin.ios打开了太多文件

时间:2018-01-05 11:59:52

标签: ios .net xamarin mvvmcross

我们正在开发一个使用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张......有趣的是,重新运行的应用程序再次无济于事。 调试/发布中存在问题,甚至是不同的设备。

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

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

1 个答案:

答案 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有助于确定哪些视图会产生泄漏。