表单控件在表单创建后不久自动处理

Posted

技术标签:

【中文标题】表单控件在表单创建后不久自动处理【英文标题】:Form Control getting disposed automatically shortly after form being created 【发布时间】:2011-09-16 12:02:47 【问题描述】:

我有这个奇怪且不一致的问题。

该应用程序构建在紧凑框架 3.5 中,在 windows mobile 6.5 设备上运行。

应用程序的屏幕流程有点像这样。

MainScreen(始终运行) 屏幕1 屏幕2 屏幕3

MainsScreen -> Screen1 -> Screen2 -> Screen3 -> MainScreen

当循环完成并且应用程序返回 MainScreen 时,调用 MainScreen.Activated() 并在某个条件下自动启动 Screen1。 代码如下所示:

        private void MainScreen_Activated(object sender, EventArgs e)
    
        if (Condition)
        
            NextScreen();

            return;
        

            //other code here

    
    private void NextScreen()
    

        Screen1 formScreen1 = new Screen1 ();
        formScreen1 .Show();
    

Screen1 在表单的加载中也有这段代码:

 private void Screen1_Load(object sender, System.EventArgs e)

        if(Condition)
        
             NextScreen();
        

 private void NextScreen()
    

        Screen2 formScreen2=  new Screen2();
        formScreen2.Show();

        Close();
    

所以当 Screen1_Load 中的这个条件得到满足时,应用程序会自动启动 Screen2 并关闭它。

在这种特殊情况下,有时会在创建表单后释放 Screen2 上的控件。我知道这一点,因为我实际上可以在屏幕上看到一瞬间的控件。

这个问题也不一致,它不会在确切的场景中一直发生,这让我相信它与时间错误有关。 被释放的控件似乎也是随机选择的,大多数时候它是同一个按钮,但在某些情况下,表单中的列表框被释放了。

请注意,应用程序中没有调用 dispose 控件的代码。

非常感谢任何帮助。谢谢,希望我能很好地解释这个问题。

【问题讨论】:

【参考方案1】:

我找到了问题的原因和解决方案。 经过大量调查,我发现正在处理的按钮与调试中发生的这种偶然异常相吻合:

A first chance exception of type 'System.ObjectDisposedException' occurred in System.Drawing.dll
A first chance exception of type 'System.ObjectDisposedException' occurred in System.Drawing.dll

我还发现,当设备内存不足或认为内存不足导致 GC 运行并尝试清除内存时,可能会发生这种偶然性异常。

我使用了这个问题的答案 Prevent Garbage Collector 并且还在遭受此问题的表单上添加了 GC.KeepAlive。

机会异常仍然同时在调试中发生,但从那时起我无法重现该问题。

【讨论】:

以上是关于表单控件在表单创建后不久自动处理的主要内容,如果未能解决你的问题,请参考以下文章

Html5之基础-9 HTML表单其他控件其他常用标记

使用自动填充表单控件(自动完成属性)使表单填写更快

从 C# 上的函数处理程序访问表单控件

如何在 WebBrowser 控件中提交表单?

vue 表单控件绑定

Vue表单控件绑定