如何检测应用程序关闭?

时间:2009-05-21 22:10:37

标签: .net .net-3.5 appdomain

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

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

我的问题:有没有办法检测应用程序是否正在尝试关闭以便任何后台线程可以退出?我已经注意到AppDomain类上有几个事件,但我不确定它们将在哪些条件下以及在哪种环境中被触发。

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

此组件将在WCF服务和Windows服务应用程序中使用,我也在使用WinForm客户端应用程序进行测试。

2 个答案:

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

希望这有帮助。

答案 1 :(得分:0)

“因为这是一个低级别组件,我不希望它知道它正在运行的环境,我不希望更高级别的组件需要告诉它它正在关闭。”< / p>

这两项要求存在冲突。组件必须能够告诉应用程序何时关闭(在这种情况下,它必须知道它运行的环境),或者一些更高级别的组件(它知道环境)必须告诉它去关机。没有任何其他选择。

在我看来,组件应尽可能少地假设它们将如何使用。例如,他们不应该假设它们将在应用程序的整个生命周期中使用,但可以根据应用程序的需要随时启动和停止。即使事实证明组件的唯一使用方式是应用程序的生命周期,这种方法也可以实现更清洁的设计。因此,我会说正确的方法是让应用程序告诉组件何时不再需要它,并且它应该自行终止,无论应用程序是否正在关闭。我还想说这是设计组件时的典型方法。