2010-01-08 52 views
5

當我創建一個具有CommandBinding到一個RoutedUICommand用戶控件擔心我得到內存泄漏。WPF中的命令綁定內存泄漏

場景:

擁有RoutedUICommand在C類的靜態那裏我存儲我的命令 實現對用戶控件化CommandBindings。 將用戶控件添加到主窗體。 從主窗體中刪除用戶控件,將其引用設置爲null。

命令綁定的canExecute會繼續觸發。我沒有對UserControl的引用,所以它泄漏了。並且在表格關閉後它會持續很長一段時間。 (我沒有看到它停止)如果我強制垃圾收集它收集(以及canExecute停止射擊)

我有一個測試project說明了這一點。我在canExecute中有一個Console.WriteLine,它打印出引發方法的對象的哈希碼。它有一個按鈕來添加一個新的用戶控件和一個來刪除它。

我應該不關心這個嗎?用戶控件確實在被強制收集時收集。這是否意味着它將在下一次收集中收集?即時通訊注意到我們的應用程序的性能下降,並跟蹤內存泄漏等我們有很多用戶界面元素的複雜形式,當他們從佈局中刪除時,他們四處閒逛處理器和內存空間。 (我們使用了很多命令)我曾經想過,一旦從視覺樹中刪除了某些東西,它就不能再接收路由事件。我錯過了什麼?

回答

1

根據我的理解,命令綁定使用類似於(但不相同)的WeakEvent pattern

基本上,一個WeakReference舉行。這將允許它在你的引用結束後工作,但不會阻止你的類被GC收集而沒有其他引用它。

總之,不要擔心 - 它的工作方式應該是可行的。