異步回調,什么是異步回調?我是這樣理解的,當主線程在執行一段代碼的時候,我們用委托執行了一個線程,這個線程要返回一個結果,關鍵是什么時候返回這個結果,異步回調就是在這個線程執行完成后立即返回這個線程的結果,然后繼續執行主線程的方法。
在討論異步回調之前我們先依次來討論一下同步執行和異步執行,最后來討論異步回調。
一、同步執行
同步執行:在主線程執行的時候,主線程調用一個其它方法,此時主線程阻塞,等待調用方法執行完成后主線程才能繼續執行。
下面是同步執行的流程圖
接下來看看代碼中的同步執行
static void Main(string[] args) { #region 同步執行 for (int i = 0; i < 100; i++) { if (i == 50) { Console.Write("調用方法TakeAWhile並等待方法執行完成。"); TakeAWhile(1, 3000); Console.Write("方法TakeAWhile執行完成。。。"); } Thread.Sleep(30); Console.Write("."); } #endregion } static int TakeAWhile(int data, int ms) { Thread.Sleep(ms); return ++data; }
二、異步執行:
異步執行:在主線程在執行的時候,打開一個子線程,主線程繼續執行,當主線程需要子線程運行的結果的時候,主線程直接調用子線程運行結果,如果在調用的時候子線程還沒有執行完成,主線程等待,直到子線程執行完成,主線程再繼續執行。
下面是異步執行的流程圖
接下來我們看看代碼中的異步執行
static void Main(string[] args) { #region 異步執行 Func<int, int, int> d2 = TakeAWhile; IAsyncResult ar = d2.BeginInvoke(1, 3000, null, null); while (!ar.IsCompleted) { Console.Write("."); Thread.Sleep(50); } int result = d2.EndInvoke(ar); Console.Write("result:{0}",result); #endregion } static int TakeAWhile(int data, int ms) { Console.Write("TakesAWhile started"); Thread.Sleep(ms); Console.WriteLine("TakeAWhile Completed"); return ++data; }
三、異步回調
異步回調:主線程在執行的時候,打開一個子線程,主線程繼續執行,當子線程執行完成的時候,主線程立即輸出主線程的運行結果,主線程繼續執行。
下面是異步回調執行的流程圖
接下來我們看看代碼中的異步回調
static void Main(string[] args) { #region 異步回調 Func<int, int, int> dl = TakeAWhile; dl.BeginInvoke(1, 3000, TakesAWhileCompleted, dl); for (int i = 0; i < 100; i++) { Console.Write("."); Thread.Sleep(50); } #endregion } static int TakeAWhile(int data, int ms) { Console.Write("TakesAWhile started"); Thread.Sleep(ms); Console.WriteLine("TakeAWhile Completed"); return ++data; } static void TakesAWhileCompleted(IAsyncResult ar) { if (ar == null) throw new ArgumentNullException("ar"); Func<int, int, int> dl = (Func<int, int, int>)ar.AsyncState; int result = dl.EndInvoke(ar); Console.WriteLine("Result:{0}",result); }
說明:流程圖是通過自己的理解畫的,如果不對的地方,謝謝指出,一起探討一起學習。
同時,歡迎拍磚!!!