教程集 www.jiaochengji.com
教程集 >  操作系统  >  windows  >  正文 c#中登录窗体和欢迎窗体关闭实例 问题总结

c#中登录窗体和欢迎窗体关闭实例 问题总结

发布时间:2019-12-10   编辑:jiaochengji.com
教程集为您提供c#中登录窗体和欢迎窗体关闭实例 问题总结等资源,欢迎您收藏本站,我们将为您提供最新的c#中登录窗体和欢迎窗体关闭实例 问题总结资源
开发C#的winform是,我们通常要做登录窗体,有的也做欢迎窗体,这里我把在做这些窗体可能会遇到的一些问题总结出来,方便新手学习。

请看下面的代码:

private void button1_Click(object sender, EventArgs e)
{
    this.Close();
    new Form2().Show();
}

这段代码想让form1中的button1在点击后关闭form1,show出form2,但是目的没有达到,form2是show出来了,但仅仅是一闪,便和关闭的form1一同消失了。

这是怎么回事呢?让我们从,Main方法里找答案。这是自动生成的Main方法:

 static void Main()
{
    Application.EnableVisualStyles();//启用可视样式
    Application.SetCompatibleTextRenderingDefault(false);//将某些控件的UseCompatibleTextRendering设为默认值
    Application.Run(new Form1());//这是关键
}

我们看到这一句

Application.Run(new Form1());

这是什么意思呢?这是要在没有窗体的情况下,在当前线程上开始运行标准应用程序消息循环,并显示这个窗体。

也就是说,要在一个没有窗体的线程上显示一个窗体,使这个线程不结束。

回过来,在button1的点击事件中,我们show出来的form2又是什么情况呢?这个form2是存活在一个新的线程上的,所以这两个窗体才不会相互阻塞。

那么问题来了,为什么把form1关掉,form2也会关掉呢?

原因是,form2所在的线程,是show它的线程的附属线程,在这里就是说,form2的线程属于form1的线程。在form1关闭的时候,form1所在的线程也就结束,连带着,就把他的所有附属线程也都结束掉了,form2所在的线程自然也不例外,所以form2也会随之关闭。

知道了原因,那么我们就来思考解决的方案。Application.Run();好像很牛的样子,我们来试试它行不行。

改变后的button1代码如下:

private void button1_Click(object sender, EventArgs e)
{
    this.Close();
    Application.Run(new Form2());
   
}

可是运行结果是报错

这是怎么回事呢?这是因为在form1所在的线程上已经运行着一个form了,运行着标准应用程序消息循环,所以就不能在这个线程上再开启一个新循环,显示一个新form了。

既然这个线程不能再来个form了,那我们就换个线程试试!最终的button1的点击事件代码如下
复制代码

private void button1_Click(object sender, EventArgs e)
{
    this.Close();

    new System.Threading.Thread(() =>
    {
        Application.Run(new Form2());

    }).Start();
}

在这里,我新建了一个线程,并在这个线程里run了form2,开启新的应用程序循环,结果正如我们所料,成功运行,form2show出,form1关闭。

总结一下:一个线程只能跑一个form,Application.Run()可以当前线程上开始运行标准应用程序消息循环。要想再开启一个不受原来窗体影响的窗体,需要开启新的线程。在新的线程里,用 Application.Run(), 这在登录窗体和欢迎窗体中会很有用

您可能感兴趣的文章:
c#中登录窗体和欢迎窗体关闭实例 问题总结
在同一窗体中使用PHP来处理多个提交任务
jBox 2.3基于jquery的最新多功能对话框插件 常见使用问题解答
解析jquery获取父窗口的元素
c# WinForm登录的三种实现方法
MDI窗体程序中防止子窗体被多次实例化——Singleton的C#实现
C#中禁止Winform窗体关闭的实现方法
C#实现点击按钮退出应用程序实例
怎么实现ASP.NET关闭当前窗口同时打开新窗口
python 怎样生成窗体

[关闭]
~ ~