Как обнаружить закрытие приложения? - PullRequest
0 голосов
/ 22 мая 2009

Я создаю компонент в серверном приложении, который управляет соединениями между моим приложением и внешней службой. Мой компонент обнаруживает, когда сервер недоступен, запускает фоновый поток до тех пор, пока служба не станет доступной, а затем снова входит в «рабочее» состояние.

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

Мой вопрос: есть ли способ определить, пытается ли приложение закрыться, чтобы можно было завершить какие-либо фоновые потоки? Я заметил пару событий в классе AppDomain, но я не уверен, при каких условиях и в каких средах они будут запускаться.

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

Этот компонент будет использоваться как в службе WCF, так и в приложении службы Windows, и я также делаю тесты из клиентского приложения WinForm.

Ответы [ 2 ]

1 голос
/ 22 мая 2009

Если вам нужно обрабатывать вещи на более низком уровне, возможно, вам нужен ваш компонент для мониторинга событие закрытия приложения. Этот код используется для мониторинга процесса закрытия. (Это также будет работать, если кто-то выполняет задачу завершения из диспетчера задач.)

Process MyMonitoredProcess = null;
private void Form1_Load(object sender, EventArgs e) 
{
    Process[] p = Process.GetProcessesByName("processName", "machineName");
    if (p.Length > 0)
    {
        MyMonitoredProcess = p[0];
        MyMonitoredProcess.EnableRaisingEvents = true;
        MyMonitoredProcess.Exited += TestProcessEndedEvent;
    } 

}

private void TestProcessEndedEvent(object sender, System.EventArgs e)
{
    // Tasks to be done if application closes.
} 

Надеюсь, это поможет.

0 голосов
/ 22 мая 2009

«Поскольку это низкоуровневый компонент, я не хочу, чтобы он что-либо знал о среде, в которой он работает, и я не хочу, чтобы высокоуровневый компонент должен был сказать ему, что он выключается».

Эти два требования противоречат друг другу. Либо компонент должен быть в состоянии сказать, когда приложение закрывается (в этом случае оно должно знать о среде, в которой он работает), либо какой-либо компонент более высокого уровня (который ДЕЙСТВИТЕЛЬНО знает о среде) должен сообщить ему выключить. Других вариантов нет.

По моему мнению, компоненты должны делать как можно меньше предположений о том, как они будут использоваться. Например, им не следует предполагать, что они будут использоваться в течение всего срока службы приложения, но их можно запускать и останавливать в любое время в соответствии с потребностями приложения. Даже если окажется, что единственный способ использования компонента - это срок службы приложения, такой подход приводит к более чистому дизайну. Поэтому я бы сказал, что правильный подход для приложения - сообщить компоненту, когда он больше не нужен, и он должен завершиться сам, независимо от того, закрывается ли приложение или нет. Я бы также сказал, что это типичный подход при разработке компонентов.

...