关于c# winform 中 使用多线程实现后台定时刷新 datagridview 数据

背景

本人c#新手,最近公司要求做的一个程序,需要利用后台定时查询数据绑定到datagridview上,要求程序不能出现假死,给人友好的体验,于是想到利用创建另一个线程用于查询数据然后再把数据显示在datagridview上。程序完成的时候,在本机上代码调试也没出问题,很完美,但是到了实际的运用的时候,datagridview的界面出了问题,没有数据并且显示一个大红叉,并且还报错。之前还以为是电脑环境的问题,到后来才找到原因,是多线程使用不当的问题。下面是小弟的解决方法,目前已经没有发现这个情况。如果有人发现此方法不适用或者有更好的方法,请告知,谢谢!欢迎各位大神指导!

实现代码


        /// 
        /// 查找数据(查询调用函数)
        /// 
        private void searchData()
        {  

            //开始查询数据
            Thread th = new Thread(new ThreadStart(StartSearchData));
            th.IsBackground = true;//设置为后台线程,否则即使主程序界面关闭了,程序也不会真正关闭,子线程会继续执行下去
            th.Start();
        }


        bool IsReflash = false;//控制下面while 循环,实现定时刷新的效果,如果在查询开始的时候需要设置为true,如果不需要定时查询了,设置为false就好
        private delegate void InvokeHandler();//使用代理让主线程去处理控件数据
        /// 
        ///开始查询数据库的数据
        /// 
        private void StartSearchData()
        {
            try
            {

                while (IsReflash)
                {
                    DataTable dt = new DataTable();
                    dt = GetInfo.getCLC_SO_Info();
                    if (this.IsHandleCreated)//判断句柄是否被创建,创建之后才能使用 Invoke或 BeginInvoke
                    {
                        this.Invoke(new InvokeHandler(delegate()
                        {
                            dgv_Main.DataSource = dt;
                        }));
                    }
                    Thread.Sleep(5000);//设置刷新时长
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

 

你可能感兴趣的:(c#)