【问题标题】:How do I detect the application closing?如何检测应用程序关闭?
【发布时间】:2009-05-21 22:10:37
【问题描述】:

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

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

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

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

这个组件将在 WCF 服务和 Windows 服务应用程序中使用,而且我还在 WinForm 客户端应用程序中进行测试。

【问题讨论】:

    标签: .net .net-3.5 appdomain


    【解决方案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.
    } 
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2012-05-10
        • 1970-01-01
        • 1970-01-01
        • 2019-03-27
        • 1970-01-01
        • 1970-01-01
        • 2023-01-04
        • 2011-10-01
        • 1970-01-01
        相关资源
        最近更新 更多