C#Winform进程仍然在Windows任务列表管理器关闭程序后
为什么进程仍然在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登录页面? 我必须关闭所有窗口才能真正退出/终止进程?
感谢你在前进, 甜菊
在主窗体关闭时,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等
因为Login
是应用程序关闭的最后形式,你只加载后Main_User
- 即使Login
隐藏它仍然居然有。 Windows窗体应用程序默认配置为在最后一个窗体关闭时退出。
这是因为应用程序消息循环与您的Login
表单(Application.Run(new Login())
这样做)相关联,所以您需要关闭启动应用程序以终止该过程的表单。
或者,你可以只调用LoginForm.Show()
,Application.Run
之前,存储证书的地方,然后调用Application.Run(new Main_Usr)
感谢您的回答。 '[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
看看lazyberezovsky的回答,特别是在更新部分,有一段代码,显示应该如何完成。 – 2012-04-25 09:46:33
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());
}
而且实现登录窗口中通过的财产。
顺便说一句,你有多线程里面? 这是此类错误的另一个来源。
感谢您的回答,但我无法获得l.Passed – user609511 2012-04-25 09:14:42
您有您的登录表单,只需添加'public bool Passed {get; set;}',并在成功登录时将其设置为true。 – 2012-04-26 10:08:29
我发现它,我只是使用dizlog。
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Login oLogin = new Login();
oLogin.ShowDialog();
Application.Run(new Main_Usr());
}
在这种情况下,Main_Usr将始终显示。登录是否有效。在显示Main_User之前检查登录是否成功 – 2012-04-25 09:27:48
我跟随代码@lazyberezovsky并添加此我Login.cs
private void simpleButton_Valider_Click(object sender, EventArgs e)
{
.....
DialogResult = DialogResult.OK;
return;
.....
}
你只需要关闭登录窗体(注:未形成页) – Reniuz 2012-04-25 08:59:32