在WinForms应用程序中立即关闭窗体

时间:2016-08-02 22:13:22

标签: .net vb.net winforms

调用Close()方法时,表单不会立即关闭。它必须等待其他代码(例如:所有运行方法)完成。 注意:主窗体上不会出现此行为

我想要实现的目标:

Private Sub Dummy()
    If foo() Then Close()
    If bar() Then Close()

    'Other code that shouldn't be reached
    'if 'foo()' or 'bar()' returned true.
End Sub
  • 想要致电foo()bar(),检查两个值,然后拨打Close()

    < / LI>
  • 我知道我可以这样做:

    If foo() Then
        Close()
        Exit Sub ' Or (Return)
    End If
    

但是我正在寻找更简单的东西,并且 - 最好是 - 如果有任何,将立即关闭表单而不返回调用方法

  • 有没有办法实现这个目标?
  • 这不是正确的做法吗?

3 个答案:

答案 0 :(得分:1)

  

会立即关闭表单而不返回调用者方法,如果有的话。

总是一个调用方法,即使该方法只是Windows事件循环/消息泵。如果没有调用方法,则程序退出。这就是基于堆栈的编程环境如何定义几乎所有现代计算机系统的工作方式:方法在被调用时被推送到调用堆栈,在它们结束时弹出,当堆栈上没有任何东西时,程序完了。

即使在您的程序或表单的代码中,您要求的内容与绕过调用者在堆栈上的条目相同,这与使用GOTO相同(或更糟),因为它打破了结构化编程的基本规则。

如果您确实希望程序退出,可以尝试Environment.Exit()。否则,Exit SubReturn是您的最佳选择。

答案 1 :(得分:1)

正如其他人所说,没有比你发布的更简单的模式。

  

如果我们有方法A()调用方法B(),并希望从方法B()调用Close()。在这种情况下,方法A()中的代码仍将被执行。

如果要在MethodB中关闭表单后退出MethodA,可以检查表单的IsDisposed属性。致电True后,我会Form.Close。或者,您可以检查MethodA中的Form.Visble属性;如果表格已经关闭,它将是False

这样的事情:

Sub MethodA()
    MethodB()
    If Me.IsDisposed Then Exit Sub
    ' some more code to run if Form is not closed
End Sub

Sub MethodB()
    If foo() Then
        Me.Close()
        Exit Sub
    End If
    If bar() Then
        Me.Close()
        Exit Sub
    End If
End Sub

答案 2 :(得分:0)

我认为Close()Exit Sub方法就像您希望的那样简单,真的:)

Close()不会在设计中终止VB.Net WinForms中的当前过程。所以我认为你提到的Exit Sub方法是最干净的方法。 Close()的行为有点奇怪,但它允许清理代码可以继续运行的情况,但是在子程序完成时表单将关闭的知识。