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

 更新时间:2014年12月15日 15:39:49   投稿:shichen2014  
这篇文章主要介绍了C#中登录窗体和欢迎窗体关闭方法,实例分析了C#中登录窗体和欢迎窗体关闭时出现错误的原因与解决方法,是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();
}

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

相关文章

  • C#使用MiniExcel实现导入导出数据到Excel/CSV文件

    C#使用MiniExcel实现导入导出数据到Excel/CSV文件

    MiniExcel是一个简单、高效避免OOM的.NET处理Excel查、写、填充数据的工具,这篇文章主要介绍了C#如何使用MiniExcel实现导入导出数据到Excel/CSV文件,需要的可以参考下
    2024-02-02
  • c#分页读取GB文本文件实例

    c#分页读取GB文本文件实例

    这篇文章主要介绍了c#分页读取GB文本文件的方法,对于C#实现对大数据量的读取非常具有实用价值,需要的朋友可以参考下
    2014-11-11
  • PropertyGrid自定义控件使用详解

    PropertyGrid自定义控件使用详解

    这篇文章主要为大家详细介绍了PropertyGrid自定义控件的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • C#结合JavaScript实现多文件上传功能

    C#结合JavaScript实现多文件上传功能

    在许多应用场景里,多文件上传是一项比较实用的功能,本文主要为大家详细介绍了C#如何结合JavaScript实现多文件上传功能,感兴趣的小伙伴可以了解下
    2023-12-12
  • C#基于Linq和反射实现数据持久化框架Xml4DB详解

    C#基于Linq和反射实现数据持久化框架Xml4DB详解

    在本篇文章里小编给大家整理的是关于C#基于Linq和反射实现数据持久化框架Xml4DB相关知识点,有需要的朋友们学习下。
    2019-08-08
  • 一篇文章带你轻松了解C# Lock关键字

    一篇文章带你轻松了解C# Lock关键字

    这篇文章主要给大家介绍了如何通过一篇文章带你轻松了解C# Lock关键字的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-06-06
  • C#中按字符串截取长字符串实例

    C#中按字符串截取长字符串实例

    这篇文章主要介绍了C#中按字符串截取长字符串的实现方法,以实例形式展示了C#中正则匹配截取字符串的技巧,需要的朋友可以参考下
    2014-11-11
  • 通过C#实现裁剪PDF页面功能

    通过C#实现裁剪PDF页面功能

    在处理PDF文档时,有时需要精确地裁剪页面以适应特定需求,比如去除广告、背景信息或者仅仅是为了简化文档内容,本文将指导如何使用免费.NET控件通过C#实现裁剪PDF页面,需要的朋友可以参考下
    2024-09-09
  • C# 类的声明详解

    C# 类的声明详解

    本文主要对C# 类的声明进行详细介绍。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • 详解C++中类的大小决定因数

    详解C++中类的大小决定因数

    类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下
    2025-04-04

最新评论