異步委託

簡介

委託(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 :獲取一個值,該值指示異步操做是否已完成線程

總結

該文章對委託和異步委託作了一個介紹與區別說明,不是很深刻,後期再補。指針

相關文章
相關標籤/搜索