<不同A>--所在的宿主线程体不同
this.Invoke()是在当前UI(或对象)线程的基础上的执行的委托
Delegate.Invoke()是在UI线程之外的新线程基础上执行的委托(例如下边代码的myThread)
<不同B>--参数不同
this.Invoke(Delegate)--需要传递一个委托的对象实例
Delegate.Invoke();--不需要任何参数,执行的是当前委托绑定的方法
我们看下边代码
private Delegate_LED dgate = null;//委托 private Thread myThread;//线程 /// ///构造函数 /// private QueueLED() { myThread = new Thread(new ThreadStart(StartLED));//开启线程 myThread.IsBackground = true;//后台运行,保证主程序退出时,此线程也会退出 myThread.Start();//线程开始 } private void doFunction() { //your code //循环或者定时处理的或者获取的数据代码 //Thread.Sleep(1000) }
//线程开始数据处理方法//------(一)使用this.Invoke()的代码段-------
private void StartLED() { try { while (true) { if(this.InvokeRequired) { dgate=doFunction;//委托绑定方法,doFunction是你要处理的数据方法 this.Invoke(dgate)//同步执行委托 } else { doFunction(); } Thread.Sleep(100);//循环Sleep } } catch (Exception ex) { LogRecord.RecordLog(ex.Message + ex.Source + ex.InnerException");//异常日志记录 } }
//------(二)使用Delegate.Invoke()的代码段-------
private void StartLED() { try { while (true) { dgate = UpdateFun; dgate.Invoke(); Thread.Sleep(100); } } catch (Exception ex) { LogRecord.RecordLog(ex.Message + ex.Source + ex.InnerException");//异常日志记录 } }
以上代码段都可以在不影响主程序运行的基础开辟子线程的数据处理,防止软件界面“假死”情况