NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
使用范围 --- 改变UI显示、改变控件属性等操作,要用委托 使用原因 --- 1、控件是由主线程创建 2、异步线程修改主线程控件时,会有线程安全问题,winform在重绘时会冲突 3、控件出发的事件都是属于控件所在的线程,而不是主线程,也可以理解为异步线程 实现方式 --- 1. 匿名委托 ``` //普通事件 void ButtonOnClick(object sender,EventArgs e) { // 修改控件属性     this.BeginInvoke(new Action(()=>     {         button.Text="关闭";     })); } ``` 或 ``` lblRevCount.Invoke(new MethodInvoker(delegate {     lblRevCount.Text = “1111”; })); ``` 目前发现最好得方法 ``` TaskHelper.ThreadInvokerControl(this, () => { txtPieceRateCode.Text = PieceRateCode; }); ``` 2. 方式二 ``` //1、定义一个委托,委托的名字可以自己写 private delegate void InvokeCallback( string msg); // 2、修改控件状态的方法 private void ShowMessage(string msg) {     //判断这个属性的值来决定是否要调用Invoke函数     //当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它,     //此时它将会在内部调用new MethodInvoker(LoadGlobalImage)来完成下面的步骤,这个做法保证了控件的安全     if (a控件.InvokeRequired)     {         InvokeCallback msgCallback = new InvokeCallback(ShowMessage);         a控件.Invoke(msgCallback, new object [] { msg } );     }else{         a控件.Text = msg;     } } ``` 3. 方式三 ``` //1、定义一个委托 private delegate void InvokeCallback( string msg); // 2、修改控件状态的方法 private void ShowMessage(string msg) {     //判断这个属性的值来决定是否要调用Invoke函数     //当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它,     //此时它将会在内部调用new MethodInvoker(LoadGlobalImage)来完成下面的步骤,这个做法保证了控件的安全     if (this.InvokeRequired)     {         InvokeCallback msgCallback = new InvokeCallback(ShowMessage2);         this.BeginInvoke(msgCallback,msg);     } } //3 、实现的方法 private void ShowMessage2(string strMsg) {     a控件.Text = strMsg;        } //4、任意线程调用 ShowMessage(""); ``` 4. 控件在异步线程中触发 ``` //1、定义一个委托 private delegate void InvokeCallback(string msg); //2、修改控件状态的方法 private void ShowMessage(string msg) {     if (a控件.InvokeRequired)//当前线程不是创建控件的线程时为true     {         InvokeCallback msgCallback = new InvokeCallback(ShowMessage2);         a控件.BeginInvoke(msgCallback, "参数");     } } //3、实现的方法 private void ShowMessage2(string msg) {     a控件.Text = strMsg; } //4、控件上绑定 ThreadPool.QueueUserWorkItem(async a =>{     ShowMessage(""); }); ```