2009-11-10 37 views
4

我的WPF應用程序以大約4kb/s的速度泄漏內存。任務管理器中的內存使用率不斷攀升,直到應用程序崩潰並出現「內存不足」異常。XP上的WPF內存泄漏(CMilChannel,HWND)

通過做我自己的研究,我發現,問題在這裏討論:Track down memory leak in WPF和#8的位置:http://blogs.msdn.com/jgoldb/archive/2008/02/04/finding-memory-leaks-in-wpf-based-applications.aspx

描述的問題是: 這是在WPF出現在框架的版本泄漏直到幷包括.NET 3.5 SP1。這是因爲WPF選擇使用哪個HWND將消息從呈現線程發送到UI線程的方式。此示例銷燬創建的第一個HWND,並在新窗口中啓動動畫。這會導致從呈現線程發送的消息堆積起來而不進行處理,從而導致內存泄漏。

提供的解決方案是: 解決方法是在App類的構造函數中首先創建一個新的HwndSource。這必須在任何其他HWND由WPF創建之前創建。通過創建這個HwndSource,WPF將使用它從渲染線程發送消息到UI線程。這確保了所有的消息都會被處理,而且沒有任何消息會泄漏。

但我不明白的解決方案! 我有我正在使用的應用程序的一個子類,我試圖在該構造函數中創建一個窗口,但尚未解決問題。

繼字面上的指示,它看起來像我只需要加入到我的應用程序的構造函數:

new HwndSource(new HwndSourceParameters("MyApplication")); 
+0

我對於你沒有明確的答案,但這裏有一個事實可能會有所幫助:我發現只是做一個「新的HwndSource(...)」而沒有其他東西(就像你上面展示的那樣)足以讓WPF調用RegisterClassEx來做子類(Win32調用子類;不是我們在.NET中稱爲「子類化」),而CreateWindowEx創建一個新的hWnd。這會讓我相信你上面寫的這條線是克服你所連接的特定泄漏所必需的,所以問題可能在其他地方。鏈接中的其他一些技巧可能會有所幫助。 – 2009-11-10 21:43:00

+0

是的,我注意到簡單地創建一個新的HwndSource是有益的,但是這造成了一個新的空白窗口。我認爲隱藏它可能跟沒有它一樣糟糕。 – 2009-11-11 02:09:03

+0

通過不在HwndSourceParameters中設置窗口標題,窗口停止顯示並修復內存泄漏問題。 – 2009-11-12 07:23:09

回答

6

的修復:

Application.xaml.cs

class MyApp1 : Application 
{ 
    // ... 

    public Application() 
    { 
     new HwndSource(new HwndSourceParameters()); 
    } 
    // ... 
}