委託(Delegate):就是相似於C/C++中的函數指針,因爲C#中沒有指針,使該語言存在着對某種方法的引用,該引用在運行時改變。被說成是:「委託能夠把方法看成參數在另外一個方法中傳遞和調用」,「委託是方法的快捷方式」等等,個人簡單理解就是建立兩個相同的函數,想用使用A函數,能夠藉助委託函數B進行調用。關鍵字爲delegate。
想要深刻理解委託,能夠學習一下這篇文章深刻理解委託html
在winForm開發過程當中常常用到線程,又是會遇到在多線程中訪問線程外的空間。,好比:設置textbox的Text屬性等等。若是直接設置程序必 定會報出:從不是建立控件的線程訪問它,這個異常。
一般咱們能夠採用兩種方法來解決。
一是經過設置control的屬性。
二是經過delegate,而通 過delegate也有兩種方式,一種是經常使用的方式,另外一種就是匿名方式。多線程
.NET中對invoke和begininvoke的官方定義:
control.invoke(參數delegate)方法:在擁有此控件的基礎窗口句柄的線程上執行指定的委託。
control.begininvoke(參數delegate)方法:在建立控件的基礎句柄所在線程上異步執行指定委託。
從而得知:invoke表是同步、begininvoke表示異步異步
下面舉例一個委託使用的例子:async
delegate void SafeSetText(string strMsg); private void SetText(string strMsg) { if(textbox1.InvokeRequired) //判斷是否已經申請回調 { SafeSetText objSet=new SafeSetText(SetText); //實例回調對象,後面進行執行 textbox1.Invoke(objSet,new object[]{strMsg}); //執行回調 } else { textbox1.Text=strMsg; //控件顯示 } }
.NET Framework 容許您異步調用任何方法。 爲此,應定義與您要調用的方法具備相同簽名的委託;公共語言運行時會自動使用適當的簽名爲該委託定義 BeginInvoke 和 EndInvoke 方法。函數
下面是一個異步委託的例子:學習
static void Main() { //synchronous method call //TakesAWhile(1 , 3000); //asynchronous by using a delegate TakesAWhileDelegate d1 = TakesAWhile; IAsyncResult ar = d1.BeginInvoke(1, 3000, null ,null); //執行異步委託 while(!ar.IsCompleted) { //doing something else in the main thread Console.Write("."); Thread.Sleep(50); } int result = d1.EndInvoke(ar); //獲取異步委託的結果 Console.WriteLine("Result:{0}",result); }
TakesAWhile爲須要委託函數,
TakesAWhileDelegate 爲委託函數,
BeginInvoke 方法啓動異步調用。
BeginInvoke方法返回一個 IAsyncResult,用來監視異步調用的進度,
EndInvoke 方法檢索異步調用的結果。ui
IAsyncResult 類型公開如下成員:
AsyncState :獲取用戶定義的對象,它限定或包含關於異步操做的信息
AsyncWaitHandle :獲取用於等待異步操做完成的 WaitHandle
CompletedSynchronously :獲取一個值,該值指示異步操做是否同步完成
IsCompleted :獲取一個值,該值指示異步操做是否已完成線程
該文章對委託和異步委託作了一個介紹與區別說明,不是很深刻,後期再補。指針