我在应用程序的启动形式的.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没有成功终止线程,这似乎很奇怪。
答案 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