我一直在玩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中沒有內存分析器,可以幫助我找到在哪裏看。但是我再次無法使用新的調試工具進行更新。
事實上,這可能是一個警告,但爲了避免任何可能由未發佈事件引發的問題,我沒有使用過任何類型的事件。相反,我已經實現了proactor模式的推導(這是不常用的)。有一個線程在後臺運行,它在整個應用程序中傳遞消息,併爲所有訂閱它的用戶控件插入xp,並通過實現的類屬性過濾消息類型。 發佈所有佈局事件,如點擊和用戶控件通知。 – Marco 2010-05-04 15:28:41
在應用程序初始加載時,所有用戶控件添加到可視化樹中,排除任何用戶交互,因此不需要釋放資源,SL使用相同數量的內存。更明確地說,如果應用程序首先實現我通常在其生命週期中添加的所有用戶控件,則SL4使用的內存量仍然大約爲1.6 GB。這應該排除任何內存釋放問題,因爲不需要刪除任何對象。 – Marco 2010-05-04 15:29:04
無論如何,我會檢查所有訂閱用戶事件的類,即使我遇到的問題,我相信,它與這個階段無關。 在編譯應用程序之前將所有用戶控件添加到XAML中時,SL4在加載後執行應用程序的時間量爲3/4分鐘。同時佈局完全被凍結。 這些圖形行爲將我指向UIThread,我想這是要求大量的資源。 – Marco 2010-05-04 15:29:28