C#: 异常 - 参数无效 - 窗体Dispose方法

7
当从其他表单处处理表单的对象时,会抛出异常,例如“参数无效”。
访问第二个表单的代码如下:
        Assembly X = Assembly.LoadFile(Application.StartupPath + "\\Test.dll");
        Form frminv = (Form)X.CreateInstance("Test.Form1");
        frminv.Dispose();

这是表单处理方法(从Designer.cs中)

protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);// exception is thrown from here
    }

这是堆栈跟踪

     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.OnVisibleChanged(EventArgs e)
 at System.Windows.Forms.Control.OnParentVisibleChanged(EventArgs e)
 at System.Windows.Forms.Control.OnVisibleChanged(EventArgs e)
 at System.Windows.Forms.Control.OnParentVisibleChanged(EventArgs e)
 at System.Windows.Forms.Control.OnVisibleChanged(EventArgs e)
 at System.Windows.Forms.ScrollableControl.OnVisibleChanged(EventArgs e)
 at System.Windows.Forms.Control.OnParentVisibleChanged(EventArgs e)
 at System.Windows.Forms.Control.OnVisibleChanged(EventArgs e)
 at System.Windows.Forms.ScrollableControl.OnVisibleChanged(EventArgs e)
 at System.Windows.Forms.Control.OnParentVisibleChanged(EventArgs e)
 at System.Windows.Forms.Control.OnVisibleChanged(EventArgs e)
 at System.Windows.Forms.ScrollableControl.OnVisibleChanged(EventArgs e)
 at System.Windows.Forms.Form.OnVisibleChanged(EventArgs e)
 at System.Windows.Forms.Control.WmShowWindow(Message& m)
 at System.Windows.Forms.Control.WndProc(Message& m)
 at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
 at System.Windows.Forms.ContainerControl.WndProc(Message& m)
 at System.Windows.Forms.Form.WmShowWindow(Message& m)
 at System.Windows.Forms.Form.WndProc(Message& m)
 at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
 at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
 at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
 at System.Windows.Forms.UnsafeNativeMethods.IntDestroyWindow(HandleRef hWnd)
 at System.Windows.Forms.UnsafeNativeMethods.DestroyWindow(HandleRef hWnd)
 at System.Windows.Forms.NativeWindow.DestroyHandle()
 at System.Windows.Forms.Control.DestroyHandle()
 at System.Windows.Forms.Control.Dispose(Boolean disposing)
 at System.Windows.Forms.ContainerControl.Dispose(Boolean disposing)
 at System.Windows.Forms.Form.Dispose(Boolean disposing)
 at ICFTWaveForm.WaveForm.Dispose(Boolean disposing)
 at System.ComponentModel.Component.Dispose()
 at System.Windows.Forms.Control.Dispose(Boolean disposing)
 at System.ComponentModel.Component.Dispose()
 at System.Windows.Forms.Control.Dispose(Boolean disposing)
 at System.ComponentModel.Component.Dispose()
 at System.Windows.Forms.Control.Dispose(Boolean disposing)
 at System.Windows.Forms.ContainerControl.Dispose(Boolean disposing)
 at System.Windows.Forms.Form.Dispose(Boolean disposing)
 at XXXX.frmMain.Dispose(Boolean disposing) in E:\XXXX\XXXX\frmMain.Designer.cs:line 20
 at System.ComponentModel.Component.Dispose()
 at XXXX.TestComponents.OpenComponentForTestting(stComponents TestComponent, stTestStepDetails Test, enExecutionModeTypes Mode, Boolean IsVisibleMode, Int32 nStepIndex, Int32 nTotalSteps) in E:\My Projects\XXXXXXXX\frmMDIContainer.cs:line 3145

有什么问题? 请帮我。


你能把堆栈跟踪放在这里吗? - decyclone
你能给我们展示一下你用来实例化对象并尝试处理它的代码吗?我认为你可能正在尝试处理一个静态对象,所以我只是想确认一下它不是这个问题。 - StevenMcD
你能试着创建一个小样本来复现这个问题吗?这似乎不是远程解决的事情。代码看起来还好...你在这个表单上有任何自定义控件吗? - Gishu
好的,我不知道,有人点亮Jon Skeet的信号吗? - StevenMcD
1
第一段代码片段可能不准确。避免将其编辑为您认为的问题。 - Hans Passant
@Gishu:是的,我在我的表单中使用了一些自定义控件。 - Thorin Oakenshield
1个回答

6

我需要查看代码才能确定,但也许我可以帮助你找到正确的位置...

堆栈跟踪表明,在Dispose序列期间,pictureBox正在重新绘制动画。那么当它应该死亡时,为什么picturebox还在尝试这样做呢?

在这些情况下,您可能需要执行以下操作之一:在处理之前关闭窗口(例如,在调用base.Dispose()之前禁用picturebox中的动画),或者可能存在其他需要在安全调用base.Dispose之前处理的类中创建的资源。另外,您可能已经处置了某些仍然需要的东西(例如pictureBox正在访问的图像)-检查处理“components”将实际处置的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接