2009-05-21 120 views
0

我在管理我的应用程序和外部服务之间的连接的服务器应用程序中构建组件。我的组件检测服务器何时不可用,启动后台线程直至服务可用,然后重新进入“工作”状态。如何检测应用程序关闭?

我的问题是,如果在此线程运行时调用该组件的进程退出,则应用程序将不会终止,直到线程退出。基本上,如果此服务可用,我的应用程序无法关闭。

我的问题:是否有一些方法来检测应用程序是否试图关闭,以便任何后台线程可以退出?我注意到了AppDomain类中的一些事件,但我不确定在哪些条件下以及在哪些环境中它们会被解雇。

因为这是一个低级别的组件,所以我不想让它知道它运行的环境,而且我也不希望更高级别的组件需要告诉它它正在关闭。

该组件将用于WCF服务和Windows服务应用程序,并且我还从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. 
} 

希望这有助于。