<不同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");//異常日志記錄 } }
以上代碼段都可以在不影響主程序運行的基礎開辟子線程的數據處理,防止軟件界面“假死”情況