簡介 委托(Delegate):就是類似於C/C++中的函數指針,由於C 中沒有指針,使該語言存在著對某種方法的引用,該引用在運行時改變。被說成是:“委托可以把方法當作參數在另一個方法中傳遞和調用”,“委托是方法的快捷方式”等等,我的簡單理解就是創建兩個相同的函數,想用使用A函數,可以藉助委托函數B ...
簡介
委托(Delegate):就是類似於C/C++中的函數指針,由於C#中沒有指針,使該語言存在著對某種方法的引用,該引用在運行時改變。被說成是:“委托可以把方法當作參數在另一個方法中傳遞和調用”,“委托是方法的快捷方式”等等,我的簡單理解就是創建兩個相同的函數,想用使用A函數,可以藉助委托函數B進行調用。關鍵字為delegate。
想要深入理解委托,可以學習一下這篇文章深入理解委托
在winForm開發過程中經常用到線程,又是會遇到在多線程中訪問線程外的空間。,比如:設置textbox的Text屬性等等。如果直接設置程式必 定會報出:從不是創建控制項的線程訪問它,這個異常。
通常我們可以採用兩種方法來解決。
一是通過設置control的屬性。
二是通過delegate,而通 過delegate也有兩種方式,一種是常用的方式,另一種就是匿名方式。
委托
.NET中對invoke和begininvoke的官方定義:
control.invoke(參數delegate)方法:在擁有此控制項的基礎視窗句柄的線程上執行指定的委托。
control.begininvoke(參數delegate)方法:在創建控制項的基礎句柄所線上程上非同步執行指定委托。
從而得知:invoke表是同步、begininvoke表示非同步
下麵舉例一個委托使用的例子:
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 方法檢索非同步調用的結果。
IAsyncResult 類型公開以下成員:
AsyncState :獲取用戶定義的對象,它限定或包含關於非同步操作的信息
AsyncWaitHandle :獲取用於等待非同步操作完成的 WaitHandle
CompletedSynchronously :獲取一個值,該值指示非同步操作是否同步完成
IsCompleted :獲取一個值,該值指示非同步操作是否已完成
總結
該文章對委托和非同步委托做了一個介紹與區別說明,不是很深入,後期再補。