2012-04-25 89 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; 
     ..... 
    } 
相關問題