Перехват закрытия приложения в С#

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

Это войдет в библиотеку, которая будет использоваться в приложении форм.


person UnkwnTech    schedule 03.05.2009    source источник
comment
обман? или очень близко к: stackoverflow. ком/вопросы/462903/   -  person jcollum    schedule 04.05.2009


Ответы (4)


Я бы реализовал IDisposable для классов, использующих эти ресурсы. Затем Dispose можно вызвать явно из любого метода завершения работы, поддерживаемого типом приложения (OnFormClose, OnStop, Application_End, ...).

person codybartfast    schedule 04.05.2009
comment
Сборщик мусора ничего подобного делать не будет. Финализатор вызовет метод финализатора вашего класса, который может вызывать Dispose. - person Samuel; 04.05.2009
comment
Спасибо Самуэль, я отредактировал соответственно. Хотя ссылка показывает, что деструктор вызывает Dispose, он также не освобождает управляемые ресурсы (поскольку это Dispose(false)). Однако, если кто-то создает общедоступный метод для освобождения ресурсов класса, я думаю, что следует рассмотреть возможность реализации IDisposable. - person codybartfast; 04.05.2009

Если это приложение Windows Forms, вы можете сосредоточить внимание на форме, щелкнуть молнию событий в окне свойств и использовать событие закрытия формы.

this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(OnFormClosing);

private void OnFormClosing(object sender, FormClosingEventArgs e)
{
    // Your socket logic here
}

Также, если вам нужно перехватить закрывающуюся форму, установите для свойства Cancel значение true:

e.Cancel = true;
person Cris McLaughlin    schedule 03.05.2009

Вы говорите о приложении WinForms? Если это так, используйте событие FormClosing в вашей основной форме.

person RichieHindle    schedule 03.05.2009

Я не уверен, что это лучшее место для этого, но вы можете сказать, что ваш процесс закрывается, перехватив AppDomain.ProcessExit. Это нормально для очистки, но я не думаю, что сейчас подходящее время для отправки каких-либо сообщений. :)

person JP Alioto    schedule 03.05.2009
comment
Итак, как отправить сообщение? Вам нужна помощь здесь - person deostroll; 05.01.2016