启动form.close和application.exit不终止应用程序

时间:2015-04-13 20:31:29

标签: .net vb.net winforms

我在应用程序的启动形式的.load偶然处理程序中有以下循环:

        While (Not Directory.Exists(My.Settings.pathToHome))
        Dim response As MessageBoxResult = Forms.MessageBox.Show("Some message","Some Caption", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation)
        If response = MessageBoxResult.Cancel Then
            Me.Close() 'can comment this line or next or leave both uncommented
            Forms.Application.Exit()
        End If
        options.ShowDialog() 'this line can be commented
    End While

如果用户选择"取消"在消息框上,可以执行Me.Close()和Forms.Application.Exit()行中的任何一个或两个,但是不是应用程序终止,而是while循环变为无限。通过单步调试器可以明确地看到这一点。

选项表单和消息框在消息框上第一次取消后永远不会打开,但可能会看到其中一个或两个"闪烁"随着循环旋转。如果单步执行调试器,我会听到" chime"来自消息框,但它没有出现。

我想我也可以添加"退出子"在那里。但是,这是否必要,是否可靠?特别是application.exit没有成功终止线程,这似乎很奇怪。

3 个答案:

答案 0 :(得分:2)

Exit While后需要Forms.Application.Exit

Application.Exit仍然允许线程完成他们正在做的事情,并且由于你实际上处于无限循环中,它实际上永远不会让应用程序关闭。

答案 1 :(得分:1)

Application.Exit()只是告诉Windows你的应用程序想要退出,并清理一些资源。它不会停止你的代码,所以你的循环继续运行。

您有责任让所有线程停止。你确实可以通过添加Exit Sub来做到这一点。或者某些Environment方法,例如Environment.Exit()Environment.FailFast(),但两者都是矫枉过正的,在您的情况下,您只会使用它们来隐藏不良设计。退出循环。

答案 2 :(得分:1)

你只需要摆脱循环。正如其他答案已经完全覆盖,Application.Exit()通知应用程序关闭,但它允许所有应用程序线程完成他们正在做的事情,所以当你保持在该循环中时,你的主线程永远不会完成。

打破这种循环的几种方法;最合适的方法是退出while语句,或退出整个函数。

While (Not Directory.Exists(My.Settings.pathToHome))
    Dim response As MessageBoxResult = Forms.MessageBox.Show("Some message","Some Caption", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation)
    If response = MessageBoxResult.Cancel Then
        Me.Close() 'can comment this line or next or leave both uncommented
        Forms.Application.Exit()
        Exit While 'or Exit Sub
    End If
    options.ShowDialog() 'this line can be commented
End While