C#对VISSIM进行二次开发显示“应用程序发生了未经处理的异常,gdi+中发生的一般错误”。
代码背景是采用C#编写干线信号控制,设计信号配时更改、相位差更改。
代码前期正常运行,后面会弹出如下图的方框报错

,报错内容是“应用程序发生了未经处理的异常,gdi+中发生的一般错误”。然后代码还在运行,车辆和信号灯还在正常变化,但是VISSIM的界面“左下角”的仿真时间会卡主不变,路网也会卡住,如图

。


GDI+错误,没有固定解。可以造成这种错误的原因几十条,连微软自己都折腾不清,所以就给了个“没有任何调试价值的” GDI+一般性错误。
不过大多数是情况是 出现在频繁更新picbox这块。一般建议是能using就using,能dispose就dispose。这是我们一般能正常运行代码的常见处理。不过这东西还有一大堆完全解释不清楚情况的,反正当初mono开发组是完全不相信官方的,他们基本自己重新写的gdi+和dawing和图像处理库
if (pictureBox1.Image != null)
{
pictureBox1.Image.Dispose();
}
pictureBox1.Image = newBitmap; //
using (Graphics g = Graphics.FromImage(bitmap))
{
// 在此处进行绘图操作
}
补充一下:我随便问了一下chartgpt,他回复了10种原因(嘿嘿,我知道的不只10种,但是这10种也算常见)
1 资源泄漏:未正确释放图形资源(如 Image 对象、Graphics 对象)会导致内存泄漏,最终可能引发 GDI+ 错误。
2 并发访问:多个线程同时访问相同的 GDI+ 对象可能会导致竞争条件和 GDI+ 错误。确保在多线程应用程序中使用适当的同步机制来管理图形资源。
3 错误的图像格式:尝试加载或处理不支持的图像格式,或者使用不正确的图像格式设置,可能会引发 GDI+ 错误。确保图像的格式与您的操作兼容。
4 内存耗尽:大规模图像处理或频繁创建销毁图像对象可能导致内存耗尽,从而触发 GDI+ 错误。
5 无效的绘图操作:执行无效的绘图操作,如在没有有效图像或绘图上下文的情况下尝试绘制图形,可能会导致 GDI+ 错误。
6 句柄泄漏:在使用 GDI+ 绘图时,可能会泄漏设备上下文句柄(HDC)。确保正确释放句柄,以避免 GDI+ 错误。
7 捕获异常不当:如果不捕获 GDI+ 异常,它们可能会传播并导致应用程序崩溃。确保使用 try-catch 块来捕获并处理异常,以便更好地管理错误。
8 不正确的颜色管理:在处理图像时,忽略颜色管理可能导致颜色失真和 GDI+ 错误。确保正确处理颜色管理。
9 资源超限:Windows 有一些资源限制,如 GDI 对象和用户对象。如果您超过这些限制,可能会触发 GDI+ 错误。
10 版本冲突:在某些情况下,使用不兼容的 GDI+ 版本可能导致错误。确保您的应用程序使用与操作系统兼容的 GDI+ 版本