2009-05-21 3 views
0

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

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

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

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

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

ответ

0

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

Эти два требования находятся в конфликте. Либо компонент должен иметь возможность сказать, когда приложение закрывается (в этом случае оно должно знать о среде, в которой оно работает), либо какой-либо компонент более высокого уровня (который знает об окружающей среде) должен сказать это выключить. Других вариантов нет.

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

1

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

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. 
} 

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

Смежные вопросы