0

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

我使用登录 Form.cs

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

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

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

我的伪母版页是这样的:

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

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

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

提前谢谢你,史蒂夫

4

6 回答 6

3

在 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
}

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

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 等命名。

于 2012-04-25T09:23:50.843 回答
1

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

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

于 2012-04-25T08:59:42.070 回答
0

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

于 2012-04-25T08:59:10.180 回答
0
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 属性。

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

于 2012-04-25T09:05:09.820 回答
0

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

 [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Login oLogin = new Login();
            oLogin.ShowDialog();
            Application.Run(new Main_Usr());
        }
于 2012-04-25T09:24:25.413 回答
0

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

  private void simpleButton_Valider_Click(object sender, EventArgs e)
        {
       .....
          DialogResult = DialogResult.OK;
                    return;
       .....
   }
于 2012-04-26T08:01:20.503 回答