2013-02-17 20 views
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保留在內存中。即使它應該被處理,因爲我在一個使用塊中獲得了數據。

如果我打開窗體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塊。

+0

'AssignObjectListToGrid'中會發生什麼,特別是:你會綁定任何事件嗎?而且,你是否使用內存分析器進行了調查? Windows任務管理器不是解決內存問題的最佳工具。無論如何,建議使用內存分析器,因爲它會向您顯示保留在內存中的對象。 – 2013-02-18 00:19:22

回答

0

你在一個是IDisposable的

groupList.dispose

+0

基本上這就是我正在做的。應該放棄db模型及其上下文,因爲它位於using塊中。 groupList不包含任何數據,它只是一個字符串列表,它告訴網格使用提供的內容將它自組織。 電網在關閉時處理。正如我寫的,如果我使用db模型作爲靜態屬性,我沒有內存問題。 – Markus 2013-02-17 14:06:28

0

到的DbContext的第一次調用將建立所有的任何對象的事實,處置用它做在你的代碼 後,我會處理列表配置等,並將其靜態存儲在進程內存中。要確認這一點,請嘗試添加第2次和第3次調用,並且內存佔用應保持一致。