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窗体应用程序配置为在最后一个窗体关闭时退出。

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

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


或者,您也可以在
应用程序之前调用
LoginForm.Show()
,运行
,将凭据存储在某个位置,然后调用
应用程序.Run(新的Main\u Usr)

这是因为应用程序消息循环与您的
登录
表单相关联(
应用程序.Run(新登录())
执行此操作),因此,您需要关闭启动应用程序的表单以结束流程

或者,您可以在
应用程序之前调用
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());
}
并在登录窗口内实现传递的属性

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

不会弄坏窗户的

所以它仍然是隐藏的,而这个过程仍然保存在内存中。 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的。这里有表格:)
当主应用程序关闭时,也应考虑WordFrm进程中的Login通知、MyFrm等。< /P> < P>。主申请表是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());
        }

我找到了,我只是用了dizlog

 [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;
       .....
   }

我遵循@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代码,说明应该如何操作。谢谢你的回答。”[StatThread]静态void Main(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Login-ogin=new-Login();ogin.Show();Application.Run(new-Main_-Usr());}但它会在登录程序之前打开主页查看lazyberezovsky的答案,特别是在更新部分,有一段if代码,说明应该如何操作。感谢您的回答,