我目前玩的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保留在內存中。即使它應該被處理,因爲我在一個使用塊中獲得了數據。
如果我打開窗體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
是模型的實例,而User代表表User。我可以經常調用表單,因爲我總是對這些對象使用相同的引用,所以內存使用保持在〜10MB,這是非常有意義的。
一定有什麼東西我做錯了。我已經在互聯網上搜索了該模型的使用情況並儘可能降低了內存使用量。看來最好的做法是在使用模塊的同時使用using塊。
'AssignObjectListToGrid'中會發生什麼,特別是:你會綁定任何事件嗎?而且,你是否使用內存分析器進行了調查? Windows任務管理器不是解決內存問題的最佳工具。無論如何,建議使用內存分析器,因爲它會向您顯示保留在內存中的對象。 – 2013-02-18 00:19:22