什麼是異步編程?編程
異步編程指的就是不用阻塞當前線程來等待任務的完成,而是將任務扔到線程池中去執行,當前線程能夠繼續向下執行,直至其它線程將任務完成,並回調通知當前線程。異步
整個任務從開始到結束都是異步完成的,不會阻塞當前線程。所以,異步編程很重要的一點就是,不會阻塞當前線程。async
異步編程實現異步編程
在C#語言中,經過委託能夠很方便地實現異步編程,在委託類型中定義了兩個方法BeginInvoke()和EndInvoke()spa
///<summary> ///開始執行異步操做 ///</summary> ///<param name="param">委託方法的參數</param> ///<param name="callback"></param> ///<param name="object"></param> ///<returns></returns> IAsyncResult BeginInvoke(int param,AsyncCallback callback,Object @object); ///<summary> ///結束執行異步操做,而且返回異步操做結果 ///</summary> ///<returns>委託方法的返回類型</returns> string EndInvoke(IAsyncResult result);
下面就經過一段代碼來具體實現異步編程線程
///<summary> ///定義一個委託類型 ///</summary> public delegate int AddDel(int x,int y); ///<summary> ///任務類 ///</summary> public class TaskClass { //計算任務 public static int AddTask(int x,int y) { Console.WriteLine("異步線程(ThreadId={0})開始執行計算任務.\n",Thread.CurrentThread.ManagedThreadId); Console.WriteLine("異步線程(ThreadId={0})計算中...\n",Thread.CurrentThread.ManagedThreadId); Thread.Sleep(3000); int result=x+y; Console.WriteLine("異步線程(ThreadId={0})結束執行計算任務.\n",Thread.CurrentThread.ManagedThreadId); return result; } } ///<summary> ///實現異步編程,主線程不會阻塞 ///</summary> public class AsynCallbackClass { public static int result; public static void Main(string[] args) { Console.WriteLine("主線程(ThreadId={0})開始執行.\n",Thread.CurrentThread.ManagedThreadId); AddDel addDel=new AddDel(TaskClass.AddTask); int x=123457,y=48759; Console.WriteLine("主線程(ThreadId={0})調用BeginInvoke()方法開始執行異步操做.\n", Thread.CurrentThread.ManagedThreadId); //開始執行異步操做,Callback爲定義的回調方法 addDel.BeginInvoke(x,y,Callback,null); Console.WriteLine("主線程(ThreadId={0})繼續執行...\n",Thread.CurrentThread.ManagedThreadId); Thread.Sleep(5000); //輸出計算任務返回的結果 Console.WriteLine("計算結果:{0}+{1}={2}.\n",x,y,result); Console.WriteLine("主線程(ThreadId={0})執行結束.\n",Thread.CurrentThread.ManagedThreadId); } ///<summary> ///回調方法 ///</summary> ///<param name="ar"></param> public static void Callback(IAsyncResult ar) { AsyncResult asyncResult=ar as AsyncResult; if(asyncResult ==null){ return;} AddDel addDel=asyncResult.AsyncDelegate as AddDel; if(addDel==null){return;} Console.WriteLine("回調方法中調用EndInvoke()方法結束執行異步操做,獲取計算任務結果.\n",Thread.CurrentThread.ManagedThreadId); //結束執行異步操做,並返回計算任務結果 result=addDel.EndInvoke(ar); } }
運行結果:code
從運行結果中,咱們能夠發現主線程在調用了BeginInvoke()方法後,沒有阻塞,而是繼續向下執行,並且任務也確實由一個新的線程來執行,任務執行結束後,調用回調方法,在回調方法中調用EndInvoke()方法來獲取任務執行結果。blog
1. 在異步編程中,當前線程是不會被阻塞的。string
2. C#的委託機制能夠很方便地實現異步編程。it