Выполните подпрограмму перед выходом из приложения

Я разрабатываю клиент-серверное приложение, в котором клиент запрашивает различные данные, а сервер извлекает их с локального SQL-сервера.

Мне нужно выполнить функцию при выходе из приложения, чтобы сообщить связанным службам, что сервер отключен, но я не могу понять точно, как это сделать.

На этот связанный вопрос, похоже, есть ответ:

обрабатывать событие AppDomain.ProcessExit, который возникает при выходе из родительского процесса приложения.

однако при использовании приведенного ниже кода подпрограмма onExit не выполняется при закрытии приложения, вероятно, потому, что я использую неправильный подход к этой проблеме или Environment.Exit не выполняется при выходе из приложения:

    Dim myConn As SqlConnection
    Dim cmd As New SqlCommand

    Sub Main()
        AddHandler AppDomain.CurrentDomain.ProcessExit, AddressOf onExit 
    End Sub

    Public Sub onExit(sender As Object, e As EventArgs)
        'Unrelated code removed here.
    End Sub

Чтобы уточнить, мне нужно, чтобы он выполнял onExit, когда пользователь закрывает приложение; Я не собираюсь закрывать приложение с помощью консольной команды.

Я также подумал, что, возможно, я мог бы добавить Handle к onExit, но я понятия не имею, что здесь использовать.

Возможно ли надежное выполнение подпрограммы или функции, когда пользователь пытается закрыть приложение через стандартный пользовательский интерфейс Windows Explorer? Это консольное приложение, я знаю, что это очень легко сделать в Windows Forms, и думал, что в консоли это будет легко. Очевидно, что нет.


person AStopher    schedule 29.12.2014    source источник


Ответы (1)


Вам необходимо импортировать SetConsoleCtrlHandler, как в этом примере:

Module Module1
    Public Declare Function SetConsoleCtrlHandler Lib "kernel32" (Handler As ConsoleCtrlDelegate, Add As Boolean) As Boolean
    Public Delegate Sub ConsoleCtrlDelegate()
    Sub Main()
        SetConsoleCtrlHandler(New ConsoleCtrlDelegate(AddressOf OnExit), True)
        Console.WriteLine("Please try to close down...")
        Console.ReadLine()
    End Sub

    Sub OnExit()
        MsgBox("Help I'm being closed!")
    End Sub
End Module
person Lashdog    schedule 30.12.2014