2010-05-17 73 views
3

有誰知道如何解決與ChildWindow SL3內存泄漏?Silverlight的ChildWindow內存泄漏

請參考下面的代碼片段:

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     var window = new ChildWindow(); 

     window.Closed += new EventHandler(window_Closed); 

     window.Show(); 
    } 

    void window_Closed(object sender, EventArgs e) 
    { 
     ((ChildWindow)sender).Closed -= new EventHandler(window_Closed); 

     WeakReference reference = new WeakReference(sender); 

     GC.Collect(); 

     GC.WaitForPendingFinalizers(); 

     bool isControlAlive = a.IsAlive; 
    } 

它總是顯示爲還「活着」 - 當我監視任務管理器中IEXPLORE實例 - 內存繼續增加每次我打開和關閉兒童窗口。

請幫忙。

謝謝。

Chris

回答

4

據我所知,目前還沒有官方修復。 This page介紹了內存泄漏的性質:

... [ChildWindow]訂閱到RootVisual_GotFocus多次,但收盤時僅退訂一次。 這會導致ChildWindow永久保留在附加到RootVisual的GotFocus事件的內存中。

上修改ChildWindow.cs(731線)ChildWindow_LostFocus功能附加之前減去RootVisual_GotFocus聽衆:

每註釋部分,可以按如下來解決這個問題修改Silverlight工具包代碼再次:

Application.Current.RootVisual.GotFocus -= this.RootVisual_GotFocus; 
Application.Current.RootVisual.GotFocus += this.RootVisual_GotFocus; 
+0

注意,它可能比只是導致問題GotFocus事件更多。 SizeChanged事件也似乎是一個罪魁禍首.. – 2010-05-17 19:25:24

+0

我讀了關於GotFocus事件的評論 - 沒有意識到SizeChanged事件。所以它基本上是一個需要取消訂閱的事件處理程序 - 它只是通過ChildWindow類的代碼來查明它是哪個事件? – Chris 2010-05-17 19:54:52

+0

這個問題似乎在Silverlight 5中得到解決。在System.Windows.Controls.ChildWindow類中有'private bool _attachedRootVisualListener'字段,它在訂閱'RootVisual_GotFocus'之前被檢查。 – apdevelop 2014-03-11 09:10:58