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

  • 相关阅读:
    第五周总结
    第四周总结
    第三周总结
    第二周总结
    第一周总结
    暑假学习进度八
    使用nmtui文本框方式修改IP
    Linux 忘记密码配置
    关于公网IP和内网IP
    常见API编写方式(三种)
  • 原文地址:https://www.cnblogs.com/yangxuli/p/7349016.html
Copyright © 2011-2022 走看看