2010-05-03 66 views
2

我一直在玩Silverlight,並嘗試將我的Silverlight 3.0應用程序移植到Silverlight 4.0。 我的應用程序加載不同的XAP文件,並根據用戶請求創建一個Xaml用戶控件的實例,並將其添加到主容器中,採用一種MEF方法,以便我可以擁有一個可擴展的可插入應用程序。Silverlight 4看起來像內存不足

該應用程序非常龐大,並保持可接受的性能和初始加載我已經建立了一些幫助器類來加載後面可能會用到的所有頁面和用戶控件。

在Silverlight 3.0上,一切運行順利,目前爲止沒有任何問題。 切換到SL 4.0我注意到,當進程接近創建用戶控件的實例時,佈局會意外凍結一分鐘,有時會更多。查看任務管理器,IE的內存使用量從50MB跳至400MB,有時高達1.5GB。

如果該過程不會花費太多的時間,即使內存使用率仍然非常高,佈局仍可以正確呈現。否則,由於內存不足異常,所有內容都會崩潰。

運行在SL3中編譯的相同應用程序時,所有用戶控件加載時使用的內存大約爲200MB。在SL3中加載應用程序的時間大約爲10秒,而在SL4中需要花費3分鐘。佈局中沒有透明膠片,沒有設置透明度,沒有效果和動畫。

當用戶從一個屏幕切換到另一個屏幕時,用戶控件即時動態添加或在視覺樹中刪除。當從可視化樹中刪除用戶控件以允許GC在後臺運行時,資源都會被正確清理。

我可能做錯了什麼,但我無法弄清楚在哪裏確切地指出了這個問題的根源。據我所知,SL4中沒有內存分析器,可以幫助我找到在哪裏看。但是我再次無法使用新的調試工具進行更新。

回答

0

說實話,儘管您斷言「從可視化樹中刪除用戶控件時,資源全部清理妥當」,我將開始尋找。它確實沒有正確釋放UserControl的元素的氣味。

這通常發生在存在長時間(例如靜態)對象時引發更多瞬態對象附加到的事件。如果這些事件處理程序沒有被分離,它們會將這些對象留在內存中。

+0

事實上,這可能是一個警告,但爲了避免任何可能由未發佈事件引發的問題,我沒有使用過任何類型的事件。相反,我已經實現了proactor模式的推導(這是不常用的)。有一個線程在後臺運行,它在整個應用程序中傳遞消息,併爲所有訂閱它的用戶控件插入xp,並通過實現的類屬性過濾消息類型。 發佈所有佈局事件,如點擊和用戶控件通知。 – Marco 2010-05-04 15:28:41

+0

在應用程序初始加載時,所有用戶控件添加到可視化樹中,排除任何用戶交互,因此不需要釋放資源,SL使用相同數量的內存。更明確地說,如果應用程序首先實現我通常在其生命週期中添加的所有用戶控件,則SL4使用的內存量仍然大約爲1.6 GB。這應該排除任何內存釋放問題,因爲不需要刪除任何對象。 – Marco 2010-05-04 15:29:04

+0

無論如何,我會檢查所有訂閱用戶事件的類,即使我遇到的問題,我相信,它與這個階段無關。 在編譯應用程序之前將所有用戶控件添加到XAML中時,SL4在加載後執行應用程序的時間量爲3/4分鐘。同時佈局完全被凍結。 這些圖形行爲將我指向UIThread,我想這是要求大量的資源。 – Marco 2010-05-04 15:29:28

0

我在繼續測試,並希望分享我迄今爲止發現的內容。 瞭解SL4的行爲可能會有幫助。由於聽起來很奇怪,UIThread可能需要很長時間來呈現一堆圖形組件,並且考慮到微軟已經改進了渲染管道,我已經將我的解決方案恢復爲SL3,但我已將SL4安裝在本地主機上。

應用程序使用RIA服務並來回移動到SL4意味着我必須根據發佈的文檔對代碼進行一些更改。

與使用Visual Studio 2008測試時相比,該應用程序運行得更加平滑。內存使用率低於未安裝SL4時的內存使用率。

只要我切換到VS2010,它是一個完全不同的場景。內存不確定地增長,佈局對於捕捉用戶交互非常緩慢,有時會像之前解釋的那樣凍結。

我已經通過使用標準Rest服務禁用了RIA服務,並且該過程的質量沒有變化。最後,考慮到我將繼續測試,以便我終於明白什麼能夠讓應用程序以可接受的模式運行,但我相信內存問題是由於VS 2010的調試過程或者由於它們的組合VS 2010和SL4

0

僅供參考:在Silverlight 4.0中使用Silverlight工具包圖表時存在內存泄漏。這是一個已知的錯誤,微軟正在研究它。

0

Silverlight 4無處不在。它不能正確釋放內存。