一、前言 可能項目規模較小,項目中除了增刪改查就只剩下業務流程,以前都沒怎麼弄明白的東西時間長了就越發的模糊了... 二、使用場景 MSDN:delegate 是一種可用於封裝命名或匿名方法的引用類型。 委托類似於 C++ 中的函數指針;但是,委托是類型安全和可靠的。 BeginInvoke 方法啟 ...
一、前言
可能項目規模較小,項目中除了增刪改查就只剩下業務流程,以前都沒怎麼弄明白的東西時間長了就越發的模糊了...
二、使用場景
MSDN:delegate 是一種可用於封裝命名或匿名方法的引用類型。 委托類似於 C++ 中的函數指針;但是,委托是類型安全和可靠的。
- 匿名方法
1 static void Main(string[] args) 2 { 3 TestAnonymousMethod(delegate(string i) { return Convert.ToInt32(i); }); 4 } 5 6 static int TestAnonymousMethod(Func<string, int> func) 7 { 8 return func("10"); 9 }
- 委托類型
1 //定義委托類型 2 delegate bool CompareDelegate(int i, int j); 3 4 static void Main(string[] args) 5 { 6 //聲明對象 7 //CompareDelegate cd = new CompareDelegate(Compare); 8 CompareDelegate cd = Compare; 9 Console.WriteLine(cd(10, 20)); 10 11 TestDelegate(Compare); 12 } 13 14 //與委托類型簽名相同的方法 15 static bool Compare(int i, int j) 16 { 17 return i > j; 18 } 19 20 //委托聲明方法形參,將方法以參數傳遞 21 static void TestDelegate(CompareDelegate cd) 22 { 23 Console.WriteLine(cd(20, 10)); 24 }
- event修飾委托(寫這篇博客就是為了這一個節點...)
MSDN:event 關鍵字用於在發行者類中聲明事件。事件是特殊類型的多路廣播委托,僅可從聲明它們的類或結構(發行者類)中調用。 如果其他類或結構訂閱了該事件,則當發行者類引發該事件時,會調用其事件處理程式方法。
曾今天真的以為delegate與event是同級別的關鍵詞,直到昨天整理資料才恍然大悟,delegate跟event半毛錢關係都沒有。delegate相當於關鍵字class,使用關鍵字delegate定義委托類型,然後使用委托類型聲明委托變數,聲明變數時可用event修飾。
1 class Program 2 { 3 delegate bool CompareDelegate(int i, int j); 4 5 static void Main(string[] args) 6 { 7 Publisher p = new Publisher(); 8 p.Sample = Method; 9 p.Sample += Method; //註冊第二個方法 10 11 //event僅可在聲明它的類或結構使用=註冊事件,防止外部註冊事件時不小心覆蓋了其他地方註冊的事件方法 12 p.SampleEvent += Method; 13 p.RaiseSampleEvent(); 14 15 //event修飾後的委托只能在聲明它的類或結構中調用,沒有event修飾的的委托可在外部調用 16 p.Sample("外部測試調用"); 17 } 18 19 static void Method(string msg) 20 { 21 Console.WriteLine(msg); 22 } 23 } 24 25 public class Publisher 26 { 27 public delegate void SampleEventHandler(string msg); 28 29 //不使用event修飾 30 public SampleEventHandler Sample; 31 32 //使用event修飾 33 public event SampleEventHandler SampleEvent; 34 35 public virtual void RaiseSampleEvent() 36 { 37 if (Sample != null) 38 { 39 Sample("不使用event修飾"); 40 } 41 42 if (SampleEvent != null) 43 { 44 SampleEvent("使用event修飾"); 45 } 46 } 47 }
- 非同步委托
BeginInvoke 方法啟動非同步調用。該方法具有與你要非同步執行的方法相同的參數,另加兩個可選參數。第一個參數是一個AsyncCallback委托,此委托引用在非同步調用完成時要調用的方法。第二個參數是一個用戶定義的對象,該對象將信息傳遞到回調方法。 BeginInvoke 將立即返回,而不會等待非同步調用完成。 BeginInvoke 返回可用於監視非同步調用的進度的 IAsyncResult。
EndInvoke 方法用於檢索非同步調用的結果。它可以在調用 BeginInvoke 之後的任意時間調用。如果非同步調用尚未完成,那麼EndInvoke將阻止調用線程,直到完成非同步調用。EndInvoke的參數包括您需要非同步執行的方法的out和ref 參數以及由 IAsyncResult 返回的 BeginInvoke。1 static void Main(string[] args) 2 { 3 Console.WriteLine("主線程開始"); 4 Action<string> act = msg => 5 { 6 Thread.Sleep(1000); 7 Console.WriteLine(msg); 8 }; 9 //非同步調用 10 IAsyncResult result = act.BeginInvoke("委托方法", null, null); 11 12 Console.WriteLine("主線程。。。"); 13 14 //非同步調用完成返回 15 act.EndInvoke(result); 16 17 Console.WriteLine("主線程結束"); 18 }
-
1 static void Main(string[] args) 2 { 3 Console.WriteLine("主線程開始"); 4 Action<string> act = msg => 5 { 6 Thread.Sleep(1000); 7 Console.WriteLine(msg); 8 }; 9 10 //非同步調用,不阻塞進程 11 act.BeginInvoke("委托方法", ar => 12 { 13 Action<string> handler = (Action<string>)((AsyncResult)ar).AsyncDelegate; 14 handler.EndInvoke(ar); 15 Console.WriteLine(ar.AsyncState); 16 }, "AsyncState:OK"); 17 Console.WriteLine("主線程結束"); 18 Thread.Sleep(2000); 19 }