【问题标题】:C# Winform The process still on Windows Task list manager after close programmeC# Winform 关闭程序后进程仍在 Windows 任务列表管理器中
【发布时间】:2012-05-05 22:37:44
【问题描述】:

为什么关闭程序后进程还在Windows任务列表管理器上?

我使用登录Form.cs

 [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Login());
        }

用户成功登录后,我重定向到另一个母版页

 this.Hide();
            Main_Usr oMainUsr = new Main_Usr();                    
            oMainUsr.Visible = true;

我的伪母版页是这样的:

public Main_Usr()
        {
            InitializeComponent();
            this.IsMdiContainer = true;
        }

当我关闭母版页时,该进程仍在 Windows 任务列表管理器中。 但是当我关闭登录页面时,它会终止 Windows 任务列表管理器上的进程。

这是否意味着因为我只是隐藏了登录页面? 我必须关闭所有窗口才能真正退出/终止进程吗?

提前谢谢你, 史蒂夫

【问题讨论】:

  • 你只需要关闭登录表单(注意:表单不是页面)

标签: c# winforms login kill-process


【解决方案1】:

因为Login 是应用程序关闭的最后一个形式,所以您只能在此之后加载Main_User - 即使Login 被隐藏,它实际上仍然存在。 Windows 窗体应用程序默认配置为在最后一个窗体关闭时退出。

【讨论】:

    【解决方案2】:

    这是因为应用程序消息循环与您的Login 表单相关联(Application.Run(new Login()) 执行此操作),因此您需要关闭启动应用程序的表单才能结束进程。

    或者,您可以在Application.Run 之前调用LoginForm.Show(),将凭据存储在某处,然后调用Application.Run(new Main_Usr)

    【讨论】:

    • 感谢您的回答。 ' [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false);登录 oLogin = new Login(); oLogin.Show(); Application.Run(新 Main_Usr()); }' 但它在登录过程之前打开主页
    • 看看lazyberezovsky的回答,特别是在更新部分,有一段if代码,显示应该如何完成。
    【解决方案3】:
    this.Hide()
    

    不会杀死窗口。

    所以它保持隐藏状态,进程保留在内存中。 this.Close() 关闭窗口并从内存中删除它的对象。

    最好这样做:

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        var l = new Login();
        l.ShowDialog();
        if(l.Passed)
           Application.Run(new Login());
    }
    

    并在登录窗口中实现 Passed 属性。

    顺便问一下,你里面有多线程吗? 这是此类错误的另一个来源。

    【讨论】:

    • 感谢您的回答,但我无法通过 l.Passed
    • 您有您的登录表单,只需添加public bool Passed{get;set;} 并在成功登录时将其设置为true。
    【解决方案4】:

    在 winforms 进程将被杀死,当主应用程序窗体关闭时。主应用程序表单是在 Application.Run 调用中指定的表单。在您的情况下,它是登录表单:

    Application.Run(new Login());
    

    要关闭表单,您应该调用Close 方法。当您调用 Hide 或将 Visibility 设置为 false 时,表单会保留在内存中。它只是对用户隐藏。

    因此,要实现所需的功能,您应该将主应用程序表单更改为 Main_Usr:

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Main_Usr()); // change main form
    }
    

    然后订阅 Main_User 表单的Load 事件。在事件处理程序中执行以下操作:

    private void Main_User_Load(object sender, EventArgs e)
    {
        using (var loginForm = new Login())
        {
            Hide(); // hide main form
    
            if (loginForm.ShowDialog() != System.Windows.Forms.DialogResult.OK)
            {
                Close(); // close main form and kill process
                return;
            }
    
            Show(); // show main form if user logged in successfully 
        }
    }
    

    更新:您可以在 Main 方法中完成所有这些操作,就像这样

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        using(var loginForm = new Login())
             if (loginForm.ShowDialog() != System.Windows.Forms.DialogResult.OK)
                 return;
        Application.Run(new Main_Usr()); // change main form
    }
    

    但通常我不会隐藏主表单并将其显示在登录表单下方。因此,在这种情况下,您应该使用 Load 事件处理程序。这取决于你。

    顺便说一句,winforms 中没有母版页和页面。这一切都适用于 ASP.NET。在这里你有表格:) 还可以考虑像 LoginForm、MainForm 等命名。

    【讨论】:

      【解决方案5】:

      我找到了,我只是使用 dizlog。

       [STAThread]
              static void Main()
              {
                  Application.EnableVisualStyles();
                  Application.SetCompatibleTextRenderingDefault(false);
                  Login oLogin = new Login();
                  oLogin.ShowDialog();
                  Application.Run(new Main_Usr());
              }
      

      【讨论】:

      • 在这种情况下 Main_Usr 将始终显示。登录是否有效。在显示 Main_User 之前检查是否登录成功
      【解决方案6】:

      我遵循 @lazyberezovsky 的代码并将其添加到我的 Login.cs

        private void simpleButton_Valider_Click(object sender, EventArgs e)
              {
             .....
                DialogResult = DialogResult.OK;
                          return;
             .....
         }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多