C#Winform关闭程序后进程仍在Windows任务列表管理器上

C#Winform关闭程序后进程仍在Windows任务列表管理器上,c#,winforms,login,kill-process,C#,Winforms,Login,Kill Process,为什么关闭程序后进程仍在Windows任务列表管理器上 我使用login Form.cs [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Login());

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

我使用login 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;
        }
[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    var l = new Login();
    l.ShowDialog();
    if(l.Passed)
       Application.Run(new Login());
}
关闭母版页时,进程仍在Windows任务列表管理器中。 但当我关闭登录页面时,它会终止Windows任务列表管理器上的进程

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

提前谢谢你,
Stev

因为
登录
是应用程序关闭的最后一种形式,所以只有在这之后才能加载
主用户
——即使
登录
被隐藏,它实际上仍然在那里。默认情况下,Windows窗体应用程序配置为在最后一个窗体关闭时退出。

这是因为应用程序消息循环与您的
登录
窗体关联(
应用程序.Run(new Login())
执行此操作),因此您需要关闭启动应用程序的窗体以结束此过程

或者,您可以在
应用程序之前调用
LoginForm.Show()
,运行
,将凭据存储在某个位置,然后调用
应用程序。运行(新主应用程序)

不会弄坏窗户的

所以它仍然是隐藏的,而这个过程仍然保存在内存中。 this.Close()关闭窗口并从内存中删除其对象

最好这样做:

public Main_Usr()
        {
            InitializeComponent();
            this.IsMdiContainer = true;
        }
[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    var l = new Login();
    l.ShowDialog();
    if(l.Passed)
       Application.Run(new Login());
}
并在登录窗口内实现传递的属性

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

在winforms中,当主应用程序窗体关闭时,进程将被终止。主申请表是application.Run call中指定的申请表。在您的情况下,它是登录表单:

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
}
然后订阅主用户表单的
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的。这里有表格:)
也可以考虑命名为Login,MyFrm等。

< P>我发现了,我只使用diZLo.< /P>
 [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Login oLogin = new Login();
            oLogin.ShowDialog();
            Application.Run(new Main_Usr());
        }

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

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

您只需关闭登录表单(注意:表单不是页面),谢谢您的回答。”[StatThread]静态void Main(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Login-ogin=new-Login();ogin.Show();Application.Run(new-Main_-Usr());}“但它在登录程序之前打开主页查看lazyberezovsky的答案,特别是在更新部分,有一段if代码,说明应该如何操作。感谢您的回答,但我无法获得l.Passed您有您的登录表单,只需添加
public bool Passed{get;set;}”
并在成功登录时将其设置为true。在这种情况下,将始终显示Main\u Usr。登录是否有效。在显示主用户之前检查登录是否成功