使用Winforms .net应用程序时,我们会遇到图像列表偶尔损坏的问题。
所谓损坏,我指的是图像数量的计数将是错误的,并且/或图像可能已被系统图像(如对话框图标)所取代。
例如,下面的屏幕截图显示了显示正确数字的imageInfoCollection,但是显示了不正确数字的计数。

图像列表位于用户在整个应用程序使用过程中反复打开的表单上。图像列表由窗体上的选项卡控件使用。
这个问题只是偶尔发生,每5到20次打开一次。
加载映像列表的代码由设计器构建,并使用资源中的图像:
this.imageListCallTakingScreen.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageListCallTakingScreen.ImageStream")));
this.imageListCallTakingScreen.TransparentColor = System.Drawing.Color.Transparent;
this.imageListCallTakingScreen.Images.SetKeyName(0, "spinner.png");
this.imageListCallTakingScreen.Images.SetKeyName(1, "recommendation-star.png");
this.imageListCallTakingScreen.Images.SetKeyName(2, "recommendation-star_red.png");
this.imageListCallTakingScreen.Images.SetKeyName(3, "recommendation-star - Transparent.png");
this.imageListCallTakingScreen.Images.SetKeyName(4, "Initialisation_fail16.png");
this.imageListCallTakingScreen.Images.SetKeyName(5, "information_white.png");
this.imageListCallTakingScreen.Images.SetKeyName(6, "Check-icon.png");除了在designer.cs代码中创建它并将其连接到选项卡控件(除了我输入的错误捕获行外),其他任何地方都不使用映像列表:

想法?我们被困在了这个问题上,而谷歌并没有出现太多问题。
发布于 2014-07-25 10:41:57
imageInfoCollection字段正确地跟踪ImageList中的图像数量。Count属性跟踪本机Windows imagelist控件中实际显示的图像数。
只有一种方式,这些值可能会有一个错配,我可以想到。您的程序正在泄漏GDI对象句柄。Winform应用程序中一个相当常见的问题。这会持续很长一段时间,直到您达到这些句柄的操作系统配额为止,在您消耗了10,000个句柄之后,Windows就不再允许您创建更多的句柄了。.NET包装器类中的错误检查并不完全符合要求,因此可以在不生成异常的情况下进行。当你达到这个极限时,你会看到更多奇怪的绘画艺术品。
您可以从Task,Processes选项卡获得基本诊断。使用View + Select列并勾选GDI对象和用户对象。当您像用户一样操作程序时,请观察这些值。GDI物体的稳定上升值意味着厄运。提示您忘记使用using语句来释放System.Drawing对象。垃圾收集器跑得不够频繁让你不惹麻烦。您需要在代码中修复这个问题,这样计数器就可以在几百个对象上保持稳定。
用户对象的稳步攀升值也是一个非常常见的Winforms错误。这是一个非常致命的问题,它也会增加GDI对象的计数,而GC无法解决这个问题。当您使用Controls.Remove/At()或Controls.Clear()删除代码中的控件并忘记释放已删除的控件对象时,就会发生这种情况。
https://stackoverflow.com/questions/24953180
复制相似问题