2012-06-25 41 views
0

我們正在使用Silverlight 5和MVVM Light開發Silverlight應用程序。在視圖中呈現了超過3000個圖形元素,每個元素都具有關聯的ViewModel。一個ItemsControl用於將這些對象綁定到這些視圖模型。第一次加載視圖時,渲染3000個對象需要7秒的時間。但是,當我們通過設置新的視圖模型集合來刷新視圖時,渲染需要17秒 - 即使這次我們只渲染較少數量的ViewModels。這裏關注的是不同渲染之間的10秒差異。GC阻止Silverlight應用程序中的UI線程

我們發現,當我們阻止ViewModels被GC清理(將它們添加到另一個集合並從不釋放它們)時,後續的渲染時間也只有7秒。所以從這裏得出的結論是額外的10秒是由舊的ViewModel的垃圾收集引起的。

從我們上面看到的看來,垃圾回收阻塞了UI線程。在GC完成其工作之前,我們將該用戶界面凍結(我們將此視爲一旦我們在VM Finalizer方法中的臨時登錄完成後),那麼UI將恢復呈現。

因此,在總結,我們的時序爲:

初始3000個對象 - 〜7秒。接下來用500個對象替換 - 〜17秒。

初始500個物體 - 〜2秒。接下來用3000個對象替換 - 〜7秒。

初始3000個物體 - 〜7秒。接下來用3000個對象替換 - 〜17秒。

圍繞這個非常奇怪的問題,我們看到有什麼建議嗎?

+1

使用探查器查看額外時間正在進行的操作。 –

+0

是的,我第二個建議使用探查器來查明究竟發生了什麼,並確認GC是罪魁禍首。 –

回答

0

您可能需要手動調用垃圾回收器。它可能沒有任何影響,但我會建議調查您的代碼,並檢查是否可以將它放在代碼中的某個聰明處,以查看它是否對加載時間有任何影響。

Check this link for calling the GC manually.

+1

如果您正在手動調用GC,那麼您做錯了什麼。 – Will