2015-10-20 2 views
0

я MDI приложение и есть OnFormClosing событие, которое делает какую-то работу до конца приложения - эти строки:Выполнить код до конца приложения

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() будет всегда выполняться перед выходом приложения. Есть ли место, где можно выразиться, и быть уверенным в этом?

+0

Что является точкой входа в программу? Это форма MDI, 'Sub Main' или любая другая форма. А также эта форма MDI всегда является последней формой приложения, т. Е. Существуют ли несколько форм MDI или любой другой не-MDI-ребенок, который может быть активным даже после закрытия этого MDI? – haraman

+0

первая форма - это форма входа в систему, когда пользователь вводит учетные данные, если они правильные. Я показываю новую форму, которая является контейнером mdi и скрывается. Форма входа – Arie

+0

Никогда не используйте 'End'. Нет причин делать что-либо, чтобы закончить приложение там, потому что оно закончится * если * вы не отмените. Это обычно должно работать, если эта форма является последней формой закрытия (и, как вы, очевидно, настроили приложение), и нет какого-либо необработанного исключения в другом месте – Plutonix

ответ

0

Я бы использовал Sub Main в модуле, который отобразит GUI и в конечном итоге обработает процесс разблокировки в Try ... Catch.

  1. Добавить модуль в проект.
  2. Добавить модуль Sub к модулю.
  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 
+0

Я должен добавить, что этот код не будет работать, если вы используете оператор End. Это немедленно завершает выполнение. Это должно обрабатывать большинство исключений, независимо от того, явно ли они вызваны или являются результатом некоторого непреднамеренного состояния времени выполнения. – JerryM