[英]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.