C#控制台应用程序 - 如何判断应用程序何时关闭?

时间:2010-09-30 20:08:26

标签: c# console exit

所以我有一个程序需要在退出之前进行一些清理,即使它是强制退出。我知道,按下电源按钮是强行退出,不会发生清理,但这也会导致其他更大的问题。

该程序挂钩了许多事件来处理清理工作。我的问题是,在调试模式下编译时这不能正常工作,并且在发布模式下编译并在VS(F5)内运行时,这不能正常工作。在发布模式下,从控制台或文件管理器运行,一切都按照预期进行。

当试图调试应用程序时,如果Handler例程被触发,我会得到一个很好的对话框,说vshost已经失败,正在寻找问题的解决方案......

如何使此代码在调试和发布模式下工作,我该怎么办?

修改

错误:Error http://i51.tinypic.com/2ppndy8.png

确切的步骤: 1)按F5 2)等一下 3)单击控制台窗口中的[X] 4)错误,请参见上面的链接图片

class Program
{
    public enum CtrlTypes
    {
        CTRL_C_EVENT = 0,
        CTRL_BREAK_EVENT,
        CTRL_CLOSE_EVENT,
        CTRL_LOGOFF_EVENT = 5,
        CTRL_SHUTDOWN_EVENT
    }

    static string conDB = "";

    [DllImport("Kernel32")]
    public static extern bool SetConsoleCtrlHandler(HandlerRoutine Handler, bool Add);
    public delegate bool HandlerRoutine(CtrlTypes CtrlType);
    private static bool ConsoleCtrlCheck(CtrlTypes ctrlType)
    {
        DatabaseAccess db = DatabaseAccess.Instance; //Issues Here

        // Cleanup code removed

        return true;
    }

    public static void ExitProcess(object sender, EventArgs args)
    {
#if DEBUG
        Debug("\n\n\nDebug Mode\nPress any key to continue...\n");
        Console.ReadKey(true);
#endif
    }

    static int Main(string[] args)
    {
        SetConsoleCtrlHandler(new HandlerRoutine(ConsoleCtrlCheck), true);
        AppDomain.CurrentDomain.ProcessExit += ExitProcess;

        // App code removed

        return 0;
    } // End main


    static void Debug(string text)
    {
        #if DEBUG
            Console.WriteLine(text);
        #endif
    }
}

0 个答案:

没有答案