使用线程回调解决子线程无法操作主线程中定义的控件

    最近在做一个c/s的项目,其中使用了wcf通信,当取数据库时,就要先通过代理类获得数据库的服务,开一个线程去不停地ping数据库服务器,这样就导致不能在窗体的load事件直接获取数据,只能再开一个线程来做控件绑定数据的工作,但由于子线程是无法操作主线程里定义的控件,所以只能用线程回调主线程来实现,下面是一个实例:

   //委托
        public delegate void SendToParent();

     /// <summary>
        ///使用线程加载devicetype树
        /// </summary>
        private void bindtvwDeviceType()
        {

           //另外开启一个线程来绑定数据

            Thread thread = new Thread(new ThreadStart(load));
            thread.Start();
     
        }

       //treeview的绑定方法
        private void DeviceTypeLoad()
        {
            List<entity.DeviceTypeEntity> models = deviceMAN.GetModelListDeviceType("");
            TreeNode tmpNd;
            foreach (entity.DeviceTypeEntity model in models)
            {
                tmpNd = new TreeNode();
                tmpNd.Name = model.TypeID.ToString();
                tmpNd.Text = model.TypeName;

                tvwDeviceType.Nodes.Add(tmpNd);
                //  bindtvwDeviceType(tmpNd.Nodes, tmpNd.Name);//递归调用方法         
            }
        }
        /// <summary>
        /// 使用线程回调主线程的控件
        /// </summary>
        private void load()
        {
            while (true)
            {
                if (deviceMAN != null)
                {
                    //通过委托当子线程结束时回调主线程的方法

                    SendToParent send1 = new SendToParent(DeviceTypeLoad);
                    this.BeginInvoke(send1);
  
                    break;
                }
                else
                {
                    Thread.Sleep(2000);
                }
            }
            
        }

posted @ 2010-10-25 13:54  我的食草堂  阅读(579)  评论(0编辑  收藏  举报