参数不是有效的异常和资源管理器

本文关键字:异常 资源管理器 有效 参数 | 更新日期: 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 堆,这并非不合理。 总是从内存探查器那里获得第二意见,它最了解,当我们看不到报告时,我们只是猜测它。