Dot-Net

使用附加行為防止記憶體洩漏

  • July 1, 2016

我在我的 WPF 應用程序中創建了一個“附加行為”,它允許我處理 Enter 按鍵並移動到下一個控制項。我稱之為 EnterKeyTraversal.IsEnabled,你可以在我的部落格上看到程式碼

我現在主要擔心的是我可能有記憶體洩漏,因為我正在處理 UIElements 上的 PreviewKeyDown 事件並且從未明確地“取消掛鉤”該事件。

防止這種洩漏的最佳方法是什麼(如果確實有的話)?我是否應該保留我正在管理的元素的列表,並在 Application.Exit 事件中解開 PreviewKeyDown 事件?有沒有人在他們自己的 WPF 應用程序中使用附加行為取得成功,並提出了一個優雅的記憶體管理解決方案?

我不同意丹尼藍精靈

一些 WPF 佈局對象可能會阻塞您的記憶體,並且在沒有進行垃圾回收時使您的應用程序變得非常緩慢。所以我發現單詞的選擇是正確的,你正在將記憶體洩漏給你不再使用的對象。您希望這些項目被垃圾收集,但事實並非如此,因為某處存在引用(在本例中為來自事件處理程序)。

現在尋求真正的答案:)

我建議您閱讀MSDN 上的這篇 WPF 性能文章

不刪除對像上的事件處理程序可能會使對象保持活動狀態

對像傳遞給其事件的委託實際上是對該對象的引用。因此,事件處理程序可以使對象保持比預期更長的時間。在對已註冊偵聽對象事件的對象執行清理時,必須在釋放對象之前刪除該委託。使不需要的對象保持活動狀態會增加應用程序的記憶體使用量。當對像是邏輯樹或可視樹的根時尤其如此。

他們建議您研究弱事件模式

另一種解決方案是在完成對像後刪除事件處理程序。但我知道,對於附加屬性,這一點可能並不總是很清楚..

希望這可以幫助!

引用自:https://stackoverflow.com/questions/14061