none
关于Closing触发事件问题 RRS feed

  • 问题

  • 简单的还原问题,如下:

    Private Sub btnClose_Click(.......) Handles btnClose.Click

    Me.Close()

    End Sub

    Private Sub Input_Closing(.......) Handles MyBase.Closing

    .....

    Me.Close()

    .....

    Sub

    以上就是代码的大概结构,在.net framework-1.1环境上Closing只执行一次就结束了,程序也没有任务问题,而在.net framework-4.7.2环境上会一直循环导致程序崩溃。

    想问下,.net framework-4.7.2环境下为什么会跟.net framework-1.1的不一样。

    2020年9月9日 8:01

全部回复

  • Hi zongxuli,

    在 .NET Framework 4.7.2 环境下, 如果表单被任何事件关闭( Me.close() ),它将告诉该表单关闭,这将再次触发该事件( Input_Closing ),然后尝试再次关闭, 所以这会导致无限循环,并最终引起 ‘Stackoverflow Exception’.

    解决方法是:

    1. 使用 Application.Exit() 方法关闭表单

        Private Sub Input_Closing(...) Handles MyBase.Closing
            Application.Exit()
        End Sub

    2. 改用Disposed事件,因为 FormClosing事件触发得太早了,这将不断引起 Me.Close()的无限循环,Disposed事件触发的更晚.

        Private Sub Input_Closing(...) Handles MyBase.Disposed
            Me.Close()
        End Sub

    至于为什么在 .NET Framework 1.1中会出现不一样的执行结果,由于1.1的版本过于古老所以无法进行相应测试,尚不清楚造成该情况的原因,但根据文档显示:Closing事件从 .NET Framework 2.0 开始就已经过时,建议使用 FormClosing 事件代替。

    以上希望对你有帮助。

    Best Regards,

    Xingyu Zhao


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    2020年9月10日 1:53
    版主