2010-10-29 42 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); 
} 

也许这可以帮助别人一天。

相关问题