0

我目前正在使用 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 块。

4

2 回答 2

0

对 dbcontext 的第一次调用将构建所有配置等,并将其静态存储在进程内存中。要确认这一点,请尝试添加第二次和第三次调用,并且内存占用应该保持一致。

于 2013-02-17T15:43:19.873 回答
0

在您在代码中完成列表后,我将处理该列表,实际上处理任何 IDisposable 对象

groupList.dispose

于 2013-02-17T14:02:07.957 回答