2010-07-02 25 views
2

我有一個WPF應用程序,當我使用TabControl.Items.Remove(TabItem)TabControl關閉TabItem時,不釋放 TabItem使用的內存。它只是使 TabItem不可見而 TabItem對象仍然保留在內存中。有沒有辦法從內存中刪除這個 TabItem對象?任何幫助,將不勝感激。TabControl.Items.Remove(TabItem)不釋放TabItem使用的內存

+0

你有TabItem上的事件處理程序嗎? – 2010-07-02 21:20:37

+0

我有一個UserControl(TextBoxes + Grids + Graphs +這些事件)作爲此TabItem中的內容,並且在此TabiItem中有一個關閉按鈕(CloseImage +單擊事件)。 – 2010-07-04 04:13:41

+1

你是什麼意思「TabItem仍然在內存中」。你是如何驗證的? – flq 2010-08-01 21:45:51

回答

1

您需要從其父項中完全切出一個對象,以便對其進行垃圾回收。這也意味着事件( - = blah)。

即使這樣做,該對象仍可能在內存中,直到下一次掃描GC。

您可以強制調用GC,但不建議。 http://msdn.microsoft.com/en-us/library/system.gc.aspx

+1

我有一個用戶控件(TextBoxes + Grids + Graphs +這些事件)作爲一個TabItem.Content和在這個TabiItem有一個關閉按鈕(CloseImage +單擊事件)。那麼我應該裁減哪些事件(TabItem.Content的事件或Click事件放在關閉按鈕上)? – 2010-07-04 04:16:43

+0

我相信點擊和刪除標籤項。 – keyle 2010-07-04 10:25:03

3

據我所知,所有的事件處理程序都必須「分離」,同時你也應該釋放tabItem上的所有綁定。

另外如果我沒有弄錯CommandBindings,KeyGestures也會導致泄漏。

嘗試使用CLR分析器。它爲我節省了很多時間,儘管我沒有用過WPF。但我很確定它可以處理它。

+0

CLR Profiler:http://www.microsoft.com/downloads/details.aspx?familyid=A362781C-3870-43BE-8926-862B40AA0CD0&displaylang=en – nomail 2010-08-01 21:34:23

+0

它可以處理它。但是,有時可以非常努力地獲得正確的粒度。我建議在SOS/WinDbg中使用它來完成repro而不是在profiler下運行,這可能會完全破壞性能。 – 2010-08-02 01:01:16

+0

可以做的另一件事是在移除所有事件處理程序等後調用GC.Collect,並查看是否收集了對象(當然,僅用於調試目的),如果它被收集,則不存在泄漏 - 如果沒有仍然沒有釋放任何東西 – Captain 2010-08-02 09:17:41