【问题标题】:How to end process after closing whole application in C#.NET?在 C#.NET 中关闭整个应用程序后如何结束进程?
【发布时间】:2009-10-26 08:42:55
【问题描述】:

我有一个 .NET 2005 (C#) 桌面应用程序,其中有一个登录表单和一个 MDI 表单,然后它们有多个子表单。所有其他表格都只能以 MDI 形式打开。

用户登录后,我隐藏登录表单,然后显示 MDI 表单,但是当我关闭 MDI 表单时,我的应用程序进程并没有结束,因为登录表单仍然隐藏。我希望,当用户关闭 MDI 表单时,整个应用程序应该关闭(本质上,该进程不应该显示在任务管理器中),因为如果每次用户关闭并重新打开应用程序并登录,它会创建一些性能问题。

我正在做如下的事情:

//my login validation script,

//after successful login

this.Hide();

if (globalData.ObjMdiMain.IsDisposed)
{
    globalData.ObjMdiMain = new mdiMain();
}
globalData.ObjMdiMain.Show();

globalData 是我的静态类,我在其中创建整个应用程序所需的全局对象。在那里,我已经定义了我的 MDI 表单的 ObjMdiMain 对象,我正在登录表单中访问它。

那么,是否有任何方法或函数可以结束系统的整个过程,例如“Application.End();”还是别的什么?

谢谢!

【问题讨论】:

    标签: c# .net visual-studio-2005 desktop-application


    【解决方案1】:

    我从您的描述中假设(如果我错了,请纠正我),您已将登录表单设置为启动表单,如下所示:

        static void Main() {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new LoginForm());
        }
    

    不要那样做。改为这样:

        static void Main() {
    
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
    
            LoginForm frm = new LoginForm();
            if(frm.ShowDialog() == DialogResult.Cancel) {
                return;
            }
    
            Application.Run(new MdiForm());
        }
    

    在您的登录表单代码中,根本不调用 MDI 表单,只需验证用户名和密码并允许登录表单退出。然后Main 方法将正确调用 MDI 表单。

    当您关闭 MDI 表单时,您的应用程序将自然退出。

    【讨论】:

    • 是的,你是对的,我有登录表单作为启动表单,让我试试你的代码。
    • 嗨@Christian,我已经测试了你的代码,但是当我在成功登录检查后使用this.Close() 关闭我的登录表单时,我收到了这个farm3.static.flickr.com/2480/4052283130_893d670f92_o.png 错误。
    • 我正在使用 Windows7 和 VS2005。
    • 抱歉,Prashant,我无法访问该 URL。错误消息文本是什么?
    • Christian:无论如何,图像 url 工作正常;我收到“System.Threading.SemaphoreFullException was unhandled”异常消息“将给定计数添加到信号量将导致它超过其最大计数。”
    【解决方案2】:

    我觉得奇怪的是您在初始登录后隐藏了登录窗口。为什么不关闭它?那么您将不会遇到当前的问题:成功登录后,您只有主 MDI 窗口,当它关闭时退出正在运行的 Windows 窗体应用程序。您是否有理由隐藏登录窗口而不是关闭它?

    【讨论】:

    • 因为Login是应用程序的主要形式,当我关闭它时,它会结束整个应用程序。
    • 我同意Christian Hayter的观点:不要使用简单运行默认表单的默认项目结构,而是编写自己的启动代码。另请参阅stackoverflow.com/questions/406385/… 以获取将顶级致命异常处理考虑在内的示例。在我的示例中,您的登录 GUI 逻辑将代替 // whatever you need/want here
    【解决方案3】:

    我想你看过Application.Exit

    【讨论】:

      【解决方案4】:

      Application.Exit()会发送一个windows消息来关闭所有表单并退出消息循环。

      【讨论】:

      • 但它实际上并没有这样做,它会导致一些未经处理的异常。
      • 那么它导致了什么异常?
      • 您的代码中的其他地方存在线程安全问题。找到问题的根源。分析引发异常的信号量并查看您的代码以找出问题所在。
      【解决方案5】:

      我不想把它告诉你,但是...Application.Exit() 是你想要的。如果你真的尝试过,你就会找到它。不过,我必须同意 peSHIr 的观点,如果它给您带来问题,您为什么要保留登录表单?

      【讨论】:

        【解决方案6】:

        这是关闭实际进程的一种方式,但这是关闭应用程序的坏方法:

        Environment.Exit(Code) 
        

        您可以将代码设置为 0. 或其他整数,这将告诉 windows wath 是应用程序执行的结果。

        我建议你先关闭登录表单,然后关闭你的应用程序,这是正确的方法。

        祝你好运;)

        【讨论】:

          【解决方案7】:

          这似乎是一个 MySql .net 连接器错误,因为我使用 mysql .net 连接器 DLL 连接到我的 mysql 数据库。我也看到了其他一些抱怨。看 http://bugs.mysql.com/bug.php?id=36688

          我使用的是 5.1 版的 MySQL .net 连接器 DLL,我刚刚升级到 6.1(最新),它工作正常,没有任何错误。

          在此处下载最新的 DLL:http://dev.mysql.com/downloads/connector/net/6.1.html

          谢谢

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-07-20
            • 1970-01-01
            • 1970-01-01
            • 2010-11-02
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多