• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#解决关闭多线程的form主窗体时抛出ObjectDisposedException异常

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

一、现象:

我在主窗体新建线程,使用子线程来处理接收到的数据,并且更新窗体显示内容,但关闭主窗体程序之后就程序就报错,如下所示:

二、分析问题:

由于新建线程的处理函数里边是一直死循环处理数据,虽然窗体程序form关闭了,但后台新建的线程还在运行,新建的线程会通过this.Invoke来更新UI主窗体线程,所以程序会报错。

private void PdoProcess()
        {
            //CanOpenDevice.visible
            while (true)
            {
                GloableVar.pdocount++;
                if (GloableVar.pdocount > 1000)
                    GloableVar.pdocount = 0;
                ShowPdo(GloableVar.pdocount);
                Thread.Sleep(100);
            }
         }

为了在关闭form主窗体程序时可以把子线程去更新UI主窗体的线程也关闭,通过使用try catch来解决这个问题。

private void ShowPdo(int data)
        {
            try
            {
                if (this.InvokeRequired)
                {
                    pdo pdodate = new pdo(ShowPdo);
                    this.Invoke(pdodate, new object[] { data });
                }
                else
                {
                    textBox1.Text = data.ToString();
                }
            }
            catch(Exception ex)
            {

            }
            
        }

catch将捕获任何发生的异常,程序一直在try里边运行,除非try里边的代码运行发生异常才到catch里边运行。如上程序所示,在主窗体程序关闭后,子线程通过this.Invoke要去更新UI主窗体程序,这时catch就会检测到异常,程序就不会进入try,而进入catch而不会发生去更新UI主窗体程序的报错的问题。

三、参考文档

https://www.lanhusoft.com/Article/113.html
http://www.cnblogs.com/shuaijie/articles/3478750.html

by 羊羊得亿
2017-08-12 ShenZhen


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#添加用户自定义控件的两种方式发布时间:2022-07-10
下一篇:
C#中的cookie编程发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap