在某些过程中,我将对象存储到文件中(序列化)。每批将存储100个文件。我很快就收到“打开文件太多”的错误。
我正在使用后立即关闭StreamWriter,我也尝试处理该文件。我有一个多线程应用程序,但我将存储集中到一个线程中,以确保不会有多个并行的X操作。我现在甚至按对象存储对象(一次一个),我仍然会收到此错误。
看起来“关闭”或“处理”StreamWriter是不够的。有人在想吗?
我尝试了很多不同的代码,但这是我目前的代码:
Log.i("Streamwriter opened");
StreamWriter outfile = new StreamWriter (filePath);
outfile.Write (content);
outfile.Close ();
outfile.Dispose ();
Log.i("Streamwriter closed");
我也打印出来以确保“打开”文件后立即“关闭”文件。
有什么想法吗?
答案 0 :(得分:1)
在发布此问题之前,我已经尝试了仪器和I / O模板,但在那里找不到任何奇怪的东西。我现在尝试了以下链接中的一些其他方法:on iOS/iPhone: "Too many open files": need to list open files (like lsof)(链接发布在poupou在他的评论中发布的stackoverflow线程中)
对我来说最好的方法就是在终端中键入“lsof”。我立即看到我的数据库有很多打开的文件。 在序列化之前,我还将对象的ID写入我的数据库。因为错误“太多打开的文件”总是指向我的序列化代码(而不是我的数据库代码),我正在寻找一个问题。
将对象插入数据库时,我正在使用“SqliteConnection”。我正在关闭并处理此对象,但是,这似乎还不足以真正关闭我的数据库文件。
此网址对我有用:SQLite keeps the database locked even after the connection is closed
我确实没有处置“SqliteCommand”本身。
修好后,我不再收到此错误。
谢谢!的
SqliteConnection cnn = new SqliteConnection(dbConnection);
cnn.Open();
SqliteCommand mycommand = new SqliteCommand(cnn);
mycommand.CommandText = sql;
object value = mycommand.ExecuteScalar();
mycommand.Dispose (); // <= THIS FIXED THE ERROR
cnn.Close();
cnn.Dispose ();
答案 1 :(得分:0)
如果使用的是FileSystemWatcher,则可能是问题的原因:SO post
当我们在项目中禁用FileSystemWatcher时,错误消失了(尽管Xamarin.Mac遇到了相同的错误,但可能与Xamarin.iOS也相关)。