C#基礎:線程之異步回調(委托)


       異步回調,什么是異步回調?我是這樣理解的,當主線程在執行一段代碼的時候,我們用委托執行了一個線程,這個線程要返回一個結果,關鍵是什么時候返回這個結果,異步回調就是在這個線程執行完成后立即返回這個線程的結果,然后繼續執行主線程的方法。

      在討論異步回調之前我們先依次來討論一下同步執行和異步執行,最后來討論異步回調。

一、同步執行

      同步執行:在主線程執行的時候,主線程調用一個其它方法,此時主線程阻塞,等待調用方法執行完成后主線程才能繼續執行。

  下面是同步執行的流程圖

 

  接下來看看代碼中的同步執行

        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);
        }

 

說明:流程圖是通過自己的理解畫的,如果不對的地方,謝謝指出,一起探討一起學習。

    同時,歡迎拍磚!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM