2012-04-24 103 views
0

目前,我必須修復現有的泄漏大量內存的Silverlight應用程序。使用Redgate's ANT profiler我設法檢測到可能的問題。其中之一是一個靜態類,它封裝了一個Web服務,它包含兩個事件處理程序來支持異步計算。
你已經猜到了......很多對象都給這個處理程序分配了一個事件,但是大多數對象不會再次釋放它。因此,這些對象鏈接到這些靜態事件,因此幾乎從未發佈...由於事件處理程序而導致內存泄漏

我需要一個簡單的修復程序來解決此問題。那麼,我有什麼可能的選擇來解決這個內存泄漏問題,而這些更改沒有太大的影響?

使得事件處理非靜態將導致巨大的變化,因此不希望的動作......

+0

你可以嘗試取消分配事件處理程序,當你不再需要它們? – tomasmcguinness 2012-04-24 08:47:28

+0

@tomasmcguinness:我想這是提供庫的典型場景,但是您無法控制調用者的編碼質量。但是你是對的,這實際上是最好的解決方案......做一個乾淨的通話與訂閱和取消訂閱事件。 – 2012-04-24 08:54:49

+0

取消分配是一個選項,但這個項目是一個大混亂...我沒有創造它,但他們期望我執行奇蹟。 :-)最大的挑戰是找到我可以取消分配的正確位置。用100.000行代碼,不包括XAML ... Blimey! – 2012-04-24 09:00:26

回答

2

使用Weak Event pattern(不知道是否有可能與SL)。這將允許一個更骯髒的編程模型調用你的靜態方法。

一個更好的選擇是正確訂閱/取消訂閱事件(同意tomasmcguinness),但這意味着您可以更改調用代碼和/或要求消費者更好地開發。

另一種解決方案可以使用異步模式。也許在方法調用中等待一個Callback委託,或者甚至更好的是返回一個Task對象。

+0

挑戰在於我無法將靜態類更改爲非靜態類,並且有數百個地方分配了此事件,但從未發佈過。但是,弱事件可能會解決它。 – 2012-04-24 09:35:51