zoukankan      html  css  js  c++  java
  • C#解决关闭多线程的form主窗体时抛出ObjectDisposedException 异常

    一、现象:

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

    二、分析问题:

    由于新建线程的处理函数里边是一直死循环处理数据,虽然窗体程序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

  • 相关阅读:
    PHP学习(数组)
    PHP学习(语言结构语句)
    PHP学习(运算符)
    PHP学习(数据类型)
    PHP学习(mysqli函数)
    PHP小知识总结(1)
    buffer的相关小知识
    SQL知识总结(1)
    用JS实线放大镜的效果
    单行中文字和图片的相关height和line-height特性
  • 原文地址:https://www.cnblogs.com/yangxuli/p/7349016.html
Copyright © 2011-2022 走看看