为何添加至List的Bitmap会损坏?Dispose操作是否影响列表对象?
问题根源与解决办法
兄弟,你这个问题的核心原因其实很简单——你用using包裹了Bitmap的创建,导致添加到列表后它直接被释放了。
咱们先理清楚using的作用:它是C#里用来自动释放非托管资源的语法糖,当using代码块执行结束时,会自动调用对象的Dispose()方法,把Bitmap底层的图像数据从内存里清掉。你把_bitmap添加到_list后,using块就结束了,这时候_bitmap对应的资源已经被回收,而列表里存的只是这个Bitmap对象的引用,指向的是已经没有数据的空壳,自然就显示“损坏”了。
至于你问的“调用Dispose是否会破坏列表中的Bitmap”——答案是肯定的。因为列表里存的不是Bitmap的副本,而是对象的引用,Dispose释放的是这个对象本身的资源,所以列表里的引用对应的对象也会变成无效状态。
给你两个解决思路:
思路一:移除
using,手动管理Dispose时机
既然你需要把Bitmap存在列表里长期使用,就不要用using包裹它的创建,等到你真正不再需要整个列表的时候,再遍历列表逐个调用Dispose()释放资源:List<Bitmap> _list = new List<Bitmap>(); public void MyMethod() { var _bitmap = new Bitmap(1920, 1080); _list.Add(_bitmap); } // 当你不再需要列表里的Bitmap时,调用这个方法清理 public void CleanupBitmaps() { foreach (var bmp in _list) { bmp.Dispose(); } _list.Clear(); }思路二:添加Bitmap的副本到列表
如果你因为某些原因必须保留using(虽然这个场景下没必要),可以创建一个Bitmap的副本添加到列表,这样using释放的是原对象,列表里的副本还能正常使用:List<Bitmap> _list = new List<Bitmap>(); public void MyMethod() { using (var _bitmap = new Bitmap(1920, 1080)) { // 创建原Bitmap的副本 var bitmapCopy = new Bitmap(_bitmap); _list.Add(bitmapCopy); } }不过要注意,这种方式会占用双倍内存,后续也别忘了给副本调用
Dispose()。
内容的提问来源于stack exchange,提问作者To Mi
相关产品推荐
相关产品推荐

