簡體   English   中英

C#Winform關閉程序后,該過程仍在Windows任務列表管理器上

[英]C# Winform The process still on Windows Task list manager after close programme

為什么關閉程序后進程仍在Windows任務列表管理器上?

我使用登錄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;
        }

當我關閉母版頁時,該過程仍在Windows Task List Manager上。 但是,當我關閉登錄頁面時,它會終止Windows Task List Manager上的進程。

這是因為我只是隱藏登錄頁面? 我必須關閉所有窗口才能真正退出/終止該過程嗎?

提前謝謝你,史蒂夫

在主窗體關閉時,在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
}

然后訂閱Main_User表單的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。 在這里,您可以使用表單:)也可以考慮使用LoginForm,MainForm等命名。

這是因為應用程序消息循環與您的Login表單相關聯( Application.Run(new Login())執行此操作),因此您需要關閉啟動應用程序的表單以結束該過程。

或者,您可以只在Application.Run之前調用LoginForm.Show() ,將憑據存儲在某個地方,然后調用Application.Run(new Main_Usr)

由於Login是應用程序關閉的最后一種形式,因此僅在此之后才加載Main_User即使Login被隱藏,它實際上仍然存在。 默認情況下,Windows窗體應用程序配置為在最后一個窗體關閉時退出。

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屬性。

順便說一句,您內部有多線程嗎? 這是此類錯誤的另一個來源。

我找到了,我只是用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;
       .....
   }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM