C# new Bitmap()正在引发随机的、不可跟踪的异常

C# new Bitmap()正在引发随机的、不可跟踪的异常,c#,C#,我的代码中有几个点只是创建一个新的位图对象,如下所示: bmpTile=新位图(8,8,PixelFormat.Format32bppArgb); 简单,对吗?出于某种原因,我在这样的行中随机得到异常。所谓随机,我的意思是,在相同的事件序列之后,我不能在同一行上始终如一地重现相同的异常。我甚至不能为你们创建一个单元测试 我得到的最常见的例外是: ArgumentException:参数无效。 TargetSite:{Void.ctor(Int32,Int32,System.Drawing.Im

我的代码中有几个点只是创建一个新的位图对象,如下所示:

bmpTile=新位图(8,8,PixelFormat.Format32bppArgb);
简单,对吗?出于某种原因,我在这样的行中随机得到异常。所谓随机,我的意思是,在相同的事件序列之后,我不能在同一行上始终如一地重现相同的异常。我甚至不能为你们创建一个单元测试

我得到的最常见的例外是:

ArgumentException:参数无效。
TargetSite:{Void.ctor(Int32,Int32,System.Drawing.Imaging.PixelFormat)}
下一个最常见的方法甚至没有从程序内部提供堆栈跟踪:

AccessViolationException:尝试读取或写入受保护的内存。这通常表示其他内存已损坏。
堆栈跟踪:
位于System.Drawing.SafeNativeMethods.Gdip.IntGdipDisposeImage(HandleRef图像)
位于System.Drawing.SafeNativeMethods.Gdip.GdipDisposeImage(HandleRef图像)
在System.Drawing.Image.Dispose(布尔处理)处
在System.Drawing.Image.Finalize()中
TargetSite:{Int32 IntGdipDisposeImage(System.Runtime.InteropServices.HandleRef)}
每当我尝试创建一个新的位图时,它似乎很难处理旧的位图,但是为什么呢?我到处都在使用锁位和解锁位,但我总是成对使用:我从不在没有后续解锁位的情况下调用锁位

那么是什么导致Dispose()像这样失败呢


编辑:我应该提到的是,它不会发生在第二次尝试。它大约发生在第五次或第六次尝试时,这意味着它已经处理了前四个或五个位图而没有问题。

这两个问题都有相同的根本原因。LockBits()之后的代码正在损坏非托管堆。在这样的代码中通常使用指针或Marshal.Copy(),因此在位图边界之外写入时没有诊断。你只有在运气好的时候才能得到访问权限违规。但更典型的是,直到稍后,当堆分配器尝试从堆中分配或释放块失败时,您才会获得它们。很难诊断,因为崩溃位置与原始错误无关。

您正在执行线程吗?如果没有,你确定吗?你能发布更多的代码吗?我们不能只做纯粹的猜测。除了@SLaks提到的线程之外,您是在表单或WPF窗口上显示这些位图,还是以其他方式打印它们?SLaks:代码是从UI事件调用的,所以我认为它是线程化的。但每当我调用LockBits时,bmpTile上就有一个lock()。克里斯:它们在WinForm上以图片框的形式显示。不过,我理解错了。通常,当我在位图边界之外写入时,我会立即得到一个异常,而不是在稍后处理它时。你是对的,我在一个角落里超出了位图边界。