我目前正在使用 EF,因为我想在一个新项目中使用它,但我遇到了一个我无法向自己解释的小内存问题。
情况如下:
我打开一个包含显示数据的网格的新表单。如果OnLoad
我使用实体框架模型从数据库中获取数据:
Using db As New OfficeDatabaseModelContainer(DatabaseManager.Instance.ProductiveConnectionString)
Dim groupList As List(Of String) = New List(Of String)
groupList.Add("Active")
GridUtils.AssignObjectListToGrid(grdUser, db.User, GetType(User), groupList)
End Using
这段代码增加了大约 10MB 的内存(由于测试我从数据库中读取了 15k 行)。当我关闭表单时,我以编程方式处理表单以及包含数据的网格。但是数据库模型上下文的 10MB 保留在内存中。即使它应该在我在 using 块中获取数据时被处理。
如果我打开表单 10 次,它总是将新的数据量添加到内存中(这是有道理的),但不会清除已处理的数据。
我什至试图GC.Collect()
在关闭表单时打电话,但它也无济于事。
内存泄漏不是来自网格或其他东西。我证明了使用以下代码:
Dim userList = DatabaseManager.Instance.ProductiveDatabase.User
Dim groupList As List(Of String) = New List(Of String)
groupList.Add("Active")
GridUtils.AssignObjectListToGrid(grdUser, userList, GetType(User), groupList)
这样,我在单例类中就有了数据库模型的静态属性。其中ProductiveDatabase
是模型的实例,用户代表表用户。我可以随时调用表单,因为我希望内存使用量保持在 ~10MB,这非常有意义,因为我总是以这种方式对相同对象使用相同的引用。
一定有什么我做错了。我已经在互联网上搜索了模型的使用情况并尽可能降低内存使用量。似乎这里的最佳实践是在使用模型时使用 using 块。