当前位置: 移动技术网 > IT编程>开发语言>c# > C#中登录窗体和欢迎窗体关闭方法分析

C#中登录窗体和欢迎窗体关闭方法分析

2019年07月18日  | 移动技术网IT编程  | 我要评论
本文实例分析了c#中登录窗体和欢迎窗体关闭方法。分享给大家供大家参考。具体分析如下: 在c#的winform编程中,我们经常会做登录窗体或欢迎窗体,并把他们作为启动窗体。

本文实例分析了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();
}

希望本文所述对大家的c#程序设计有所帮助。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网