前两天,在做一个小软件时碰到一个怪异的StackOverflowException异常,试了几次后还是百思不得其解。

当时我想做的功能很简单:我想在程序开始启动时和在窗口被最小化后,自动隐藏掉窗口。

场景重现

打开VS2010或VS2008,建立一个新的应用程序项目,VS会自动帮我们建立一个Form1窗口文件,回到代码编辑窗口,会看到如下的代码:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    }

好,现在加上我们需要的代码实现在窗体最小化时自动隐藏掉窗体:

代码

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //窗口有变化时进行窗体处理
            this.SizeChanged += new EventHandler(Form1_SizeChanged);
        }

void Form1_SizeChanged(object sender, EventArgs e)
        {
            //窗体如果已被最小化,则隐藏窗体
            if (this.WindowState == FormWindowState.Minimized)
            {
                this.Visible = false;
                this.ShowInTaskbar = false;
            }
        }
    }

F5运行,程序正常,可达到我们想要的效果。。OK,现在问题来了:因为我还需要在程序一启动时也自动隐藏掉。所以我就写了以下这句代码:

代码

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //窗口有变化时进行窗体处理
            this.SizeChanged += new EventHandler(Form1_SizeChanged);
            //自动将窗口最小化, 以便在事件中自动处理隐藏
            this.WindowState = FormWindowState.Minimized;
        }

void Form1_SizeChanged(object sender, EventArgs e)
        {
            //窗体如果已被最小化,则隐藏窗体
            if (this.WindowState == FormWindowState.Minimized)
            {
                this.Visible = false;
                this.ShowInTaskbar = false;
            }
        }
    }

即加了上面代码中红色的那句代码,代码看起来是正常的,可是F5运行,VS却提示我这样的错误:

怪事了,怎么出现堆栈溢出了呢?!难道那个Form1_SizeChanged函数出现递归调用了?调试运行,却发现根本没有递归调用。那问题出现在哪里呢?

经N次的测试检查,发现导致出现这个异常的语句是“this.ShowInTaskbar = false;”,有点怪异!!将这条语句删除或注释后,程序运行良好,但是窗体却在任务栏里出现了。如果单单这样,那问题还好解决,但更怪异的事情却来了,因为我调试时顺手写了这样的代码:

代码

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //窗口有变化时进行窗体处理
            this.SizeChanged += new EventHandler(Form1_SizeChanged);
            //不在任务栏里显示
            this.ShowInTaskbar = false;
            //自动将窗口最小化, 以便在事件中自动处理隐藏
            this.WindowState = FormWindowState.Minimized;
        }

void Form1_SizeChanged(object sender, EventArgs e)
        {
            //窗体如果已被最小化,则隐藏窗体
            if (this.WindowState == FormWindowState.Minimized)
            {
                this.Visible = false;
                this.ShowInTaskbar = false;
            }
        }
    }

即增加了上面的红色语句,按F5运行,天!程序正常运行,异常没有发生?!!

这。。这究竟是怎么一回事?我也不懂了。。。望哪位兄弟能帮我解答一下?在此多谢先了!

注:

上面的异常解决方法还可以换一种方法,即在Load事件里处理,也是不会发生异常,如下代码:

代码

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //窗口有变化时进行窗体处理
            this.SizeChanged += new EventHandler(Form1_SizeChanged); 
            this.Load += new EventHandler(Form1_Load);
        }

void Form1_Load(object sender, EventArgs e)
        {
            //窗口显示前自动最小化
            this.WindowState = FormWindowState.Minimized;
        }

void Form1_SizeChanged(object sender, EventArgs e)
        {
            //窗体如果已被最小化,则隐藏窗体
            if (this.WindowState == FormWindowState.Minimized)
            {
                this.Visible = false;
                this.ShowInTaskbar = false;
            }
        }
    }

示例项目代码下载:

/Files/kingthy/BugTest.rar

怪异的StackOverflowException异常相关推荐

  1. 使用Windbg调试StackOverflowException异常

    最近公司服务器端程序遇到一个堆栈溢出问题,偏偏是偶发性但是又在相对固定时间发生的,有一个服务器比较容易触发,平均隔个5.6天就会发生一次,且每次都是在8点23分左右抛出异常.服务器开发同事初步定位是定 ...

  2. 如何分析 StackOverflow 异常 ?

    一般来说,当你的方法递归调用次数太多大于线程栈的默认1M内存时将会抛出 StackOverflowException 异常. 举个例子,假设你有下面这段代码: using System;namespa ...

  3. System.StackOverflowException

    今天按着书上的例子写呀写,写了一下午终于做出了一个三层模式的通讯录(当然很简单),但是,弄了最后却碰到个运行时的 异常,弄得我这个asp.net菜鸟郁闷了再郁闷. 异常如下: 发生类型为 System ...

  4. [WCF权限控制]利用WCF自定义授权模式提供当前Principal[实例篇]

    在<原理篇>中我们谈到:如果采用自定义安全主体权限模式,我们可以通过自定义AuthorizationPolicy或者ServiceAuthorizationManager实现对基于当前认证 ...

  5. C#如何安全、高效地玩转任何种类的内存之Span的本质(一)。

    前言 作为.net程序员,使用过指针,写过不安全代码吗? 为什么要使用指针,什么时候需要使用它,以及如何安全.高效地使用它? 如果能很好地回答这几个问题,那么就能很好地理解今天了主题了.C#构建了一个 ...

  6. 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span

    前言 作为.net程序员,使用过指针,写过不安全代码吗? 为什么要使用指针,什么时候需要使用它? 如果能很好地回答这两个问题,那么就能很好地理解今天了主题了.C#构建了一个托管世界,在这个世界里,只要 ...

  7. 如果你也会C#,那不妨了解下F#(6):面向对象编程之“类”

    前言 面向对象的思想已经非常成熟,而使用C#的程序员对面向对象也是非常熟悉,所以我就不对面向对象进行介绍了,在这篇文章中将只会介绍面向对象在F#中的使用. F#是支持面向对象的函数式编程语言,所以你用 ...

  8. 数据挖掘期末复习速成大法 华南农业大学

    更新日志 [1] 新增了密度聚类峰值的讲解 [2] 新增了 SOM 聚类算法讲解 [3] 修正Apriori规则挖掘二级项集表 到 三级项集表更新策略:新增非频剪枝步骤. [4] 修正小数定标规范化示 ...

  9. 面试官:说一下你们线上JVM是如何优化的?一不小心聊了2个小时!!

    面试官:说一下你们线上JVM是如何优化的?一不小心聊了2个小时!! 说一JVM的内存模型是什么样子的?什么时候对象可以被收回?常见的垃圾回收器算法有哪些,各有什么优劣?什么时候对象会进入老年代?什么是 ...

最新文章

  1. 机房收费系统(VB.NET)——超具体的报表制作过程
  2. python项目实战:爬取无限火力大暴起全章节
  3. sdi线缆标准_Roland V1SDI——专业、便携、高性价比的SDI摄像机直播解决方案
  4. 电脑常用音频剪辑软件_如何使用音频剪辑软件,快速剪辑任意格式音频!
  5. 搭建XSS (跨网站指令码) 测试平台
  6. nodejs实现文件上传
  7. lombok和maven_Lombok,AutoValue和Immutables,或如何编写更少,更好的代码返回
  8. Vue3动态组件、缓存组件、分发组件
  9. 每天Leetcode 刷题 初级算法篇-杨辉三角
  10. Android POS开发
  11. 改革IMF首先要增加中国发言权
  12. 美规Homekit插座
  13. 我的世界服务器怎么无限刷红石,我的世界无限红石怎么做 无限红石BUG攻略
  14. OKR如何与绩效考核并行?
  15. mysql date的写法_mysql 对日期的写法 mybatis
  16. Windwos2008如何关闭IE增强的安全配置
  17. 泰克|安捷伦|普源|PICO示波器程控软件二次开发NS-Scope
  18. 关于数据库中与服务器连接成功,登录失败问题
  19. 数学启蒙的几点小总结
  20. matplotlib画图:柱形图、堆叠柱形图、分组柱形图。

热门文章

  1. 一文概述2017年深度学习NLP重大进展与趋势
  2. 传感器的“脖子”卡在哪儿?
  3. LoRa VS NB-IoT,一场物联网时代C位争夺战
  4. 关于生命、宇宙和万事万物的42个终极问题
  5. IDC与百度联合发报告:预测2019年人工智能十大趋势
  6. PANS最新脑神经科学研究:激活一种新语言并不费力气
  7. 有史以来最精彩的自问自答:OpenAI 转方块的机械手
  8. 北斗产业发展现状与前景预测研究
  9. AI 开发神器来了!支持 CPU 加速优化!!
  10. 拿大厂机器学习岗 offer,吐血整理的面试秘籍!