【问题标题】:Execute code before application end在应用程序结束之前执行代码
【发布时间】:2015-10-20 10:25:04
【问题描述】:

我得到了 MDI 应用程序并且有一些 OnFormClosing 事件在 End 应用程序之前做一些工作 - 这些行:

Projekt.UnlockAllLockedProjects()
End 'completly close app

在整个代码下面:

Protected Overrides Sub OnFormClosing(e As FormClosingEventArgs)
    MyBase.OnFormClosing(e)

    If e.CloseReason = CloseReason.WindowsShutDown Then
        Return
    End If

    Dim dr As DialogResult
    Select Case Lang.name
        Case Lang.LangShortcut.PL
            dr = MessageBox.Show(Me, "Kontynuować zamykanie okna?", MsgLevel.QUESTION.ToString, MessageBoxButtons.YesNo, MessageBoxIcon.Question)
        Case Lang.LangShortcut.EN
            dr = MessageBox.Show(Me, "Are you sure you want to quit?", MsgLevel.ZAPYTANIE.ToString, MessageBoxButtons.YesNo, MessageBoxIcon.Question)
        Case Else
    End Select

    ' Confirm user wants to close
    Select Case dr
        Case DialogResult.No
            e.Cancel = True
            Exit Select
        Case Else
              Projekt.UnlockAllLockedProjects()
            End 'completly close app
    End Select
End Sub

问题是,让我们假设会有应用程序错误,因此应用程序将崩溃或手动我在代码End 子句中的其他位置。如何确保Projekt.UnlockAllLockedProjects() 始终在应用退出之前执行。有什么地方可以放它并确定吗?

【问题讨论】:

  • 程序的入口点是什么?是 MDI 形式,Sub Main 还是任何其他形式。此外,此 MDI 表单是否始终是应用程序的最后一个表单,即是否存在多个 MDI 表单或任何其他非 MDI 子表单,即使在此 MDI 关闭后也可能处于活动状态?
  • 当用户输入凭据时,第一个表单是登录表单,如果它们正确,我将显示新表单,即 mdi 容器并隐藏登录表单
  • 永远不要使用End。没有理由做任何事情来结束应用程序,因为它会结束除非你取消。如果该表单是最后一个要关闭的表单(这就是您显然配置应用程序的方式)并且其他地方没有一些未处理的异常,那通常应该可以工作
  • 好的,但是有没有机会/任何地方发生意外错误,我可以放置我的代码以确保它会在之前执行?

标签: vb.net winforms mdi formclosing


【解决方案1】:

我会在一个模块中使用一个 Sub Main 来显示 GUI 并最终在 Try...Catch 中处理解锁过程。

  1. 向项目中添加一个模块。
  2. 在模块中添加一个 Sub Main。
  3. 在 Sub Main 中,使用 Try...Catch 显示表单并处理异常。
  4. 将 Startup 对象设置为 Sub Main (Project>Properties>Application)。

例子:

Module Program

    Public Sub Main(ByVal cmdArgs() As String)
        Try
            Application.Run(frmLogin)
        Catch ex As Exception
            'Any special code for handling exceptions goes here.
        Finally
            Projekt.UnlockAllLockedProjects()
        End Try
    End Sub

End Module

【讨论】:

  • 我应该补充一点,如果您使用 End 语句,此代码将不起作用。立即结束执行。这应该可以处理大多数异常,无论它们是显式引发的还是某些意外运行时条件的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-03
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
相关资源
最近更新 更多