参数不是有效的异常和资源管理器
本文关键字:异常 资源管理器 有效 参数 | 更新日期: 2023-09-27 18:32:29
我编写的Winforms .Net 4应用程序的客户端现在经常报告由于"参数无效"错误而导致崩溃。
所有的"图像"实际上都是小的资源图标(16x16像素(,而且没有那么多。它们都是通过资源管理器检索的,几乎所有它们都通过设计器生成的代码分配给按钮
每当我使用它来检索图标资源时,资源管理器似乎都会实例化一个新的位图。因此,这些没有明确处理。
我尝试查看 GDI 对象的数量和用户句柄的数量。句柄的数量是稳定的,GDI 对象的数量似乎在缓慢增加:在应用程序中打开/关闭(和释放(模式窗体后,还会使用更多。
- 该参数是否由于 GDI 对象数量过多而无效?
- 如果是,是否由资源管理器引起?
- 是否必须显式释放资源管理器创建的资源?
- 如果不是,参数无效从何而来?
在这里,当我更改工具tripmenuitem上显示的图标时
System.ArgumentException: Parameter is not valid.
at System.Drawing.Image.get_RawFormat()
at System.Windows.Forms.ToolStripItem.set_Image(Image value)
对应代码:
tsbExpand.Image = global::MyProject.Properties.Resources.arrow_in;
这是用于显示图标的图片框
System.ArgumentException: Parameter is not valid.
at System.Drawing.Image.get_FrameDimensionsList()
at System.Drawing.ImageAnimator.CanAnimate(Image image)
at System.Drawing.ImageAnimator.ImageInfo..ctor(Image image)
at System.Drawing.ImageAnimator.Animate(Image image, EventHandler onFrameChangedHandler)
at System.Windows.Forms.PictureBox.Animate(Boolean animate)
at System.Windows.Forms.PictureBox.Animate()
at System.Windows.Forms.PictureBox.OnParentChanged(EventArgs e)
at System.Windows.Forms.Control.AssignParent(Control value)
at System.Windows.Forms.Control.ControlCollection.Add(Control value)
对应代码:
this.pcbIcon.Image = global::MyProject.Properties.Resources.information;
谢谢
编辑 19/02
我记得我在下面添加了一段代码(取自http://www.codeproject.com/Tips/513764/Repainting-WinForms-windows-safely-inside-a-proces(之前注意到参数的增加是无效的问题。我不确定这是否相关
public static class WinFormUtils
{
/// <summary> Processes all Paint events only </summary>
public static void DoPaintEvents()
{
//MessageFilter registration
Application.AddMessageFilter(PaintMessageFilter.Instance);
//Process messages in the queue
Application.DoEvents();
//MessageFilter desregistration
Application.RemoveMessageFilter(PaintMessageFilter.Instance);
}
/// <summary> Custom message filter </summary>
private class PaintMessageFilter : IMessageFilter
{
static public IMessageFilter Instance = new PaintMessageFilter();
#region IMessageFilter Members
/// <summary> Message filter function </summary>
public bool PreFilterMessage(ref System.Windows.Forms.Message m)
{
return (m.Msg != 0x000F); //WM_PAINT -> we only let WM_PAINT messages through
}
#endregion
}
}
编辑 27/10/2016:参数无效确实是由上面的代码段引起的。因此,如果您不知道自己在做什么,请不要弄乱 Windows 消息!
该参数是否由于 GDI 对象数量过多而无效?
是的,这很有可能。 异常的质量很差,GDI+ 不会生成良好的错误代码。 "参数无效"并不比"它不起作用"更有意义。 GDI 对象过多或桌面堆空间不足是"它不起作用"的主要原因。
如果是,是否由资源管理器引起?
不完全是。 当您获得图像资源时,您将成为对象的所有者。 你的工作是调用它的Dispose((方法。 这很少这样做,在实践中不会造成麻烦。 除非您创建的程序永远不会对 GC 堆施加足够的压力。 使用大量控件和图形但不管理大量数据的程序。 如果您没有获得足够的 gen#2 集合,则这些对象的终结器将不会运行,并且本机操作系统对象不会被销毁。
是否必须显式释放资源管理器创建的资源?
是的。
任务管理器中的GDI对象计数器是使您保持诚实的计数器。 不要忘记看看USER Objects,另一个经典的麻烦制造者。 调用 GC。定期收集((是GDI对象计数的快速修复。 如果您只是没有使用足够的 GC 堆,这并非不合理。 总是从内存探查器那里获得第二意见,它最了解,当我们看不到报告时,我们只是猜测它。