經過定義委託,來實現同步和異步,委託經過Action和Func來實現,記錄學習委託的同步和異步的過程dom
委託的同步方法異步
委託的Invoke方法用來進行同步調用。函數
static void Main(string[] args) { //無參數方法 Action action = () => Console.WriteLine("action方法執行"); action.Invoke(); //有一個參數(多個參數基本相同) Action<string> action2 = (t) => Console.WriteLine("action方法執行,{0}", t); action2.Invoke("我在測試"); //帶一個參數帶返回值 Func<int, bool> func = (t) => { int i = new Random().Next(1, 10); Console.WriteLine("隨機數是{0}", i); return i > t; }; bool b = func.Invoke(5); Console.WriteLine("{0}",b); Console.Read(); }
同步調用會阻塞線程,若是是要調用一項繁重的工做(如大量IO操做),可能會讓程序停頓很長時間,形成糟糕的用戶體驗,這時候異步調用就頗有必要了。學習
委託的異步調用測試
異步調用不阻塞線程,而是把調用塞到線程池中,程序主線程或UI線程能夠繼續執行。委託的異步調用經過BeginInvoke和EndInvoke來實現。spa
static void Main(string[] args) { //無參數方法 Action action = () => Console.WriteLine("action方法執行"); action.BeginInvoke(null,null); //有一個參數(多個參數基本相同) Action<string> action2 = (t) => Console.WriteLine("action方法執行,{0}", t); action2.BeginInvoke("我是個測試",null,null); //帶一個參數帶返回值 Func<int, bool> func = (t) => { int i = new Random().Next(1, 10); Console.WriteLine("隨機數是{0}", i); return i > t; }; var result = func.BeginInvoke(5,null,null); bool b = func.EndInvoke(result); Console.WriteLine("{0}",b); Console.Read(); }
異步回調線程
用回調函數,當調用結束時會自動調用回調函數,解決了爲等待調用結果,而讓線程依舊被阻塞的局面。code
static void Main(string[] args) { //無參數方法 Action action = () => Console.WriteLine("action方法執行"); AsyncCallback callback1 = t => { Console.WriteLine("我是回調1"); }; action.BeginInvoke(callback1, null); //有一個參數(多個參數基本相同) Action<string> action2 = (t) => Console.WriteLine("action方法執行,{0}", t); AsyncCallback callback2 = t => { Console.WriteLine("我是回調2"); }; action2.BeginInvoke("我是個測試", callback2, null); //帶一個參數帶返回值 Func<int, bool> func = (t) => { int i = new Random().Next(1, 10); Console.WriteLine("隨機數是{0}", i); return i > t; }; AsyncCallback callback3 = t => { Console.WriteLine("我是回調3"); }; var result = func.BeginInvoke(5, callback3, null); bool b = func.EndInvoke(result); Console.WriteLine("{0}",b); Console.Read(); }