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

原文地址:https://www.cnblogs.com/yangxuli/p/7349016.html