首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

异步加载还是出有关问题

2013-01-11 
异步加载还是出问题?//先是定义public delegate voidDelegateLoadName1(string tblName ,ComboBox cmb)..

异步加载还是出问题?


//先是定义
   public delegate void  DelegateLoadName1(string tblName ,ComboBox cmb);
....
//接着再加载过程定义
   DelegateLoadName1 qudao = new DelegateLoadName1(AsyLoadName1);
  AsyncCallback Aysqudao = new AsyncCallback(this.AsyncCallbackValue);
  qudao.BeginInvoke("tbqudao", cmbCzFs, Aysqudao, "渠道加载");
.....

//定义了委托方式
 #region 异步加载数据库快捷信息
        private  void AsyncCallbackValue(IAsyncResult ar)
        {
            Console.WriteLine("" + ar.AsyncState +"加载结束");
        }

        private void AsyLoadName1(string tblname, ComboBox cmb)
        {
            CBaseFunc.LoadName(tblname , cmb );
        }
        private void AsyLoadName2(string tblname, ComboBox cmb,int tmp)
        {
            CBaseFunc.LoadName(tblname , cmb , tmp);
        }

        #endregion

//
 /// <summary>
        /// 加载基本表的名称
        /// </summary>
        /// <param name="tblName"></param>
        /// <param name="cmb"></param>
         public static  void LoadName(string tblName, ComboBox cmb)
        {
            TianLi.BLL.tbBaseInfo fBl= new TianLi.BLL.tbBaseInfo(tblName);

            cmb.SuspendLayout();
            cmb.Items.Clear(); ///**********提示线程冲突
            cmb.BeginUpdate();
        
            try
            {
                if (fBl.GetAllName() == null)
                { cmb.EndUpdate(); }
                else
                {
                    cmb.Items.AddRange(fBl.GetAllName().ToArray());
                    cmb.EndUpdate();
                }
               // cmb.SelectedIndex = 0;


                cmb.ResumeLayout();
            }
            catch (Exception ex)
            { Console.WriteLine(ex.Message); }
        }



[解决办法]
后台线程中是不能直接操作控件的,你这里提示线程才冲突的地方还是多线程部分,非主线程回调。
[解决办法]
Control.InvokeRequired判断下
[解决办法]
begininvoke会建一个相对于UI线程新的线程,所以combox的操作还是在多线程的部分,所以造成了线程冲突,要么关闭线程冲突检查,要么在做一个委托对combox进行操作

热点排行