2012-04-25 82 views
0

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

我使用登录Form.cs

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

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

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

我的伪母版页是这样的:

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

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

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

感谢你在前进, 甜菊

+0

你只需要关闭登录窗体(注:未形成页) – Reniuz 2012-04-25 08:59:32

回答

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 
} 

然后订阅Load事件Main_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 
    } 
} 

UPDATE:你可以做这一切的主要方法,像这样

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事件处理程序。随你便。

顺便说一句,winform中没有主页和页面。这一切都是为ASP.NET。在这里你有形式:) 也可以考虑命名像LoginForm,MainForm等

0

因为Login是应用程序关闭的最后形式,你只加载后Main_User - 即使Login隐藏它仍然居然有。 Windows窗体应用程序默认配置为在最后一个窗体关闭时退出。

1

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

或者,你可以只调用LoginForm.Show()Application.Run之前,存储证书的地方,然后调用Application.Run(new Main_Usr)

+0

感谢您的回答。 '[STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); 登录oLogin = new Login(); oLogin.Show(); Application.Run(new Main_Usr()); }' 但它在登录过程之前打开主页 – user609511 2012-04-25 09:13:07

+0

看看lazyberezovsky的回答,特别是在更新部分,有一段代码,显示应该如何完成。 – 2012-04-25 09:46:33

0
this.Hide() 

不`吨终止窗口。

因此,它仍然是隐藏的,并且进程保留在内存中。这个.Close()关闭窗口并从内存中删除它的对象。

这是更好地做这样的事情:

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

而且实现登录窗口中通过的财产。

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

+0

感谢您的回答,但我无法获得l.Passed – user609511 2012-04-25 09:14:42

+0

您有您的登录表单,只需添加'public bool Passed {get; set;}',并在成功登录时将其设置为true。 – 2012-04-26 10:08:29

0

我发现它,我只是使用dizlog。

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

在这种情况下,Main_Usr将始终显示。登录是否有效。在显示Main_User之前检查登录是否成功 – 2012-04-25 09:27:48

0

我跟随代码@lazyberezovsky并添加此我Login.cs

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