2010-10-29 59 views
5

假設我必須在某些控件上顯示一些圖形。但是會根據某種條件切換三張圖像。資源文件中添加了三個位圖。通過ResourceManager獲取圖像GetObject - 每次調用它或存儲結果?

因此,我通過調用ResourceManager.GetObject來檢索它們。

的問題是,它應該是:

  1. 每次我要切換圖像,我叫GetObject的得到它,並分配到控制 或
  2. 持有GetObject的結果爲每個圖像在開始時,這樣只會有3次調用GetObject。改爲從我的變量分配圖像。

這樣做1)在使用CLR Profiler查看時似乎產生了很多GC句柄。希望知道2)的任何不良副作用。

非常感謝。

回答

5

每次調用GetObject都會從程序集中讀取圖像並將其加載到Bitmap對象中。

多次調用會產生很大的開銷;你應該存儲圖像。

1

MSDN documentation指出資源的值由ResourceManager.GetObject返回。由於聽起來像個別的位圖在運行時不會改變,我唯一看到的方法#2是你的內存佔用會更大。

3

每次需要使用Resources中的圖像時,還需要指出有關調用「ResourceManager.GetObject」的其他一點,它似乎每次都會創建一個新的Windows句柄。在你的情況下可能不是什麼大不了的事,但如果你像我們一樣堅持一會兒,它可能會導致一個問題。

我們有一個DataGridView,我們將資源中的圖像推送到網格的不同字段中,當這個網格出現超過3000行時,我們實際上超過了32位程序允許的最大Windows句柄。

錯誤出現在消息「參數無效」的隨機參數異常中。它花了幾個小時認爲我們有內存泄漏,但最終發現我們加載這個GUI的應用程序處理從700-1000增加到超過10K,甚至在它完成加載之前將會崩潰整個程序並且無法恢復。所以我在這裏推薦選項2。

2

我也在我的課程中實施了"read once then store in variable" concept

舉個例子,這裏是從我的代碼的摘錄:

internal static class MyResourcesHolder 
{ 
    private static Image _i1; 
    private static Image _i2; 
    private static Image _i3; 
    private static Image _i4; 
    private static Image _i5; 

    public static Image MyImage01 => _i1 ?? (_i1 = Resources.MyImage01); 
    public static Image MyImage02 => _i2 ?? (_i2 = Resources.MyImage02); 
    public static Image MyImage03 => _i3 ?? (_i3 = Resources.MyImage03); 
    public static Image MyImage04 => _i4 ?? (_i4 = Resources.MyImage04); 
    public static Image MyImage05 => _i5 ?? (_i5 = Resources.MyImage05); 
} 

也許這可以幫助別人一天。

相關問題