使用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代码中以外的任何地方都不使用imagelist来创建它并将其连接到制表符控件(我输入的错误捕获行除外):
想法?我们被困在这个上面而谷歌并没有太多变化。
答案 0 :(得分:2)
imageInfoCollection字段可正确跟踪ImageList中的图像数量。 Count属性跟踪本机Windows imagelist控件中实际存在的图像数。
这些价值观只有一种方式可以让我想到不匹配。您的程序正在泄漏GDI对象句柄。 Winform应用程序中一个相当常见的问题。这可以工作很长一段时间,直到你达到这些句柄的操作系统配额,在你消耗了10,000个后,Windows停止允许你创建更多。 .NET包装器类中的错误检查不完全是犹太教的,所以这可以在没有生成异常的情况下发生。当你达到极限btw时,你会看到一些更奇怪的绘画文物。
您可以从“任务管理器”,“进程”选项卡中获取基本诊断信息。使用View + Select列并勾选GDI Objects和USER对象。在用户操作程序时观察这些值。 GDI Objects的稳定攀升值令人痛苦。提示您忘记使用使用语句来处置System.Drawing对象。并且垃圾收集器的运行频率不足以让您远离麻烦。您需要在代码中修复此问题,以便计数器保持稳定,例如,不超过几百个对象。
USER Objects的稳定攀升值也是非常常见的Winforms错误。这是一个相当致命的问题,它也会增加GDI对象的数量并且GC无法解决这个问题。当您使用Controls.Remove / At()或Controls.Clear()删除代码中的控件并忘记处置已删除的控件对象时,会发生这种情况。