zoukankan      html  css  js  c++  java
  • 浅析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();
            }
  • 相关阅读:
    闪回flashback
    Oracle数据文件在open状态被删除的恢复记录
    从浅到深掌握Oracle的锁
    Oracle 11g 11201_RHEL5.5_RAC_VBOX 详细搭建步骤
    AWR Report 关键参数详细分析
    16、Xtrabackup备份与恢复
    17、percona-toolkit
    插入排序
    选择排序
    冒泡排序
  • 原文地址:https://www.cnblogs.com/gc2013/p/4164099.html
Copyright © 2011-2022 走看看