正确处理未引用的映像而不进行垃圾回收C#

正确处理未引用的映像而不进行垃圾回收C#,c#,image,bitmap,garbage-collection,C#,Image,Bitmap,Garbage Collection,我有一个C#程序,它从目录中的图像创建位图列表。它将使用整个位图列表生成一个新图像,然后保存。当用户加载新目录以重复该过程时,位图列表将被清除并重新填充。位图在创建对象“新位图(路径)”时加载 当用户执行以下步骤时,出现了一个问题: 从目录1加载图像 选择不保存,而是从目录2加载图像 试图通过覆盖目录1中的图像来保存 由于“GDI+中的一般错误”,程序无法保存,因为它仍在“使用”被覆盖的图像 从目录1加载的位图的原始列表确实被清除,然后用目录2的图像重新填充。但是,Bitmap.Save()拒绝

我有一个C#程序,它从目录中的图像创建位图列表。它将使用整个位图列表生成一个新图像,然后保存。当用户加载新目录以重复该过程时,位图列表将被清除并重新填充。位图在创建对象“新位图(路径)”时加载

当用户执行以下步骤时,出现了一个问题:

  • 从目录1加载图像
  • 选择不保存,而是从目录2加载图像
  • 试图通过覆盖目录1中的图像来保存
  • 由于“GDI+中的一般错误”,程序无法保存,因为它仍在“使用”被覆盖的图像
  • 从目录1加载的位图的原始列表确实被清除,然后用目录2的图像重新填充。但是,Bitmap.Save()拒绝覆盖它以前加载的图像,除非在执行Clear()之后调用System.GC.Collect()


    我很确定这个问题与保留位图有关,即使没有引用,否则为什么垃圾收集会解决这个问题?这是解决这个问题的正确方法,还是有一种“正确”的方法来处理C#中的位图?谢谢。

    您需要在
    位图
    实例上调用
    Dispose
    。。所以他们释放了他们的文件句柄

    var bitmap = new Bitmap(path_to_file);
    // use it
    bitmap.Dispose();
    
    或者,由于
    Bitmap
    继承自实现
    IDisposable
    Image
    ,因此可以执行以下操作:

    using (var bitmap = new Bitmap(path_to_file)) {
        // use it..
    }
    

    您是否通过位图.FromStream加载它们?你目前如何“处置”它们?通过调用
    .Dispose()
    ?哦,对不起,我没有;我正在使用新位图(路径)。让我更新这个问题。我不是在打电话。Dispose();出于某种原因,我没有想到。哦,天哪,抱歉问了这么愚蠢的问题。我想我会自己回答的。。。除非你愿意。谢谢,我真不敢相信我忘了。我甚至在标题中使用了“dispose”一词。