GDI+ LockBits()/UnLockBits() 异常

6
我的程序是用C#编写的,对位图进行低级别操作。一切运作正常,但有时会出现异常“通用GDI+异常”,这种情况很少发生,但很稳定。异常发生在LockBits()和UnLockBits()函数上,它包含错误代码“-2147467259”。在GDI+语言中,它将是方法GdipBitmapLockBits并返回代码7或1。
可能会导致这种情况发生的原因有哪些?
非常感谢任何答案。

你能贴一段代码片段展示你的代码吗? - Daniel Peñalba
1
位图数据的底层存储出现了问题。可能被锁定(避免线程),可能是已释放的内存流,也可能是虚拟内存不足。 - Hans Passant
你有读/写位图的权限吗? - Hans
@HansPassant 我尝试重现异常,用大量字节填充内存并循环lockbits()和unlockbits()数千次,没有发生异常。看起来这些方法根本不使用内存。处理位图流会导致InvalidOperationException而不是通用异常。 - Zelzer
2个回答

4

GDI+对象不是线程安全的,如果在没有同步的情况下从多个线程使用它们,可能会导致崩溃。为了完整起见,我想补充一点,即释放GDI+位图支持的内存可能会在释放位图之前发生,这种情况下,当尝试使用该位图时会出现无效访问。只有在你自己分配像素数据并使用一个指向该数据的指针的构造函数时(例如此http://msdn.microsoft.com/en-us/library/zy1a2d14.aspx),才会发生这种情况。


1
我已经调查了这个问题,似乎它可能与线程有关。 我不确定真正导致这些问题的原因,并且没有证据,但在整个代码中设置锁之后,问题似乎已经解决了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接