程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#基礎知識 >> C# 同步調用 異步調用 異步回調 多線程的作用

C# 同步調用 異步調用 異步回調 多線程的作用

編輯:C#基礎知識

同步調用   : 委托的Invoke方法用來進行同步調用。同步調用也可以叫阻塞調用,它將阻塞當前線程,然後執行調用,調用完畢後再繼續向下進行。

 

異步調用  :同步調用會阻塞線程,如果是要調用一項繁重的工作(如大量IO操作),可能會讓程序停頓很長時間,造成糟糕
的用戶體驗,這時候異步調用就很有必要了。
異步調用不阻塞線程,而是把調用塞到線程池中,程序主線程或UI線程可以繼續執行。
委托的異步調用通過BeginInvoke和EndInvoke來實現。

 

異步回調函數  :當異步調用時,主線程並沒有等待,而是直接向下運行了。
但是問題依然存在,當主線程運行到EndInvoke時,如果這時調用沒有結束(這種情況很可能出現),這時為了等待調用結果,線程依舊會被阻塞。
解決的辦法是用回調函數,當調用結束時會自動調用回調函數

 

同步調用程序實現

class Program
      {
          //同步調用
          //委托的Invoke方法用來進行同步調用。同步調用也可以叫阻塞調用,它將阻塞當前線程,然後執行調用,調用完畢後再繼續向下進行。
           public delegate int AddHandler(int a,int b);//聲明委托
           static void Main(string[] args)
                {
                     Console.WriteLine("*******(同步調用)SyncInvokeTest*******");
                     AddHandler handler = new AddHandler(Add);//定義委托,傳入參數
                     int result = handler.Invoke(1, 2);//委托的同步調用,主線程執行到此時停止,即阻塞。調用同步調用委托的的方法,執行此方法。
                     Console.WriteLine("(繼續做其他的事)Do other work.....");//other work 是指Add方法,進行兩數相加操作。
                     Console.WriteLine(result);
                     Console.ReadLine();
                 }

            private static int Add(int a, int b)//一個加法方法是一個線程
                 {
                     Console.WriteLine("Computing"+a+" + "+b+"...");
                     Thread.Sleep(9000);//模擬方法進行9秒
                     Console.WriteLine("computing complete.");
                     return a + b;
                  }
      }

 

異步調用程序實現

class Program
        {
             //**************異步調用***********
            //異步調用不阻塞線程,而是把調用塞到線程池中,程序主線程或UI線程可以繼續執行。
            //委托的異步調用通過BeginInvoke和EndInvoke來實現。
            public delegate int AddHandler(int a,int b);
            static void Main(string[] args)
                  {
                       Console.WriteLine("********(異步調用)AsyncInvokeTest******");
                       AddHandler handler = new AddHandler(Add);
                       IAsyncResult result = handler.BeginInvoke(1, 2, null, null);
                       Console.WriteLine("(繼續做其他的事)do other work...");
                       Console.WriteLine(handler.EndInvoke(result));
                       Console.ReadLine();
                   }

              private static int Add(int a, int b)
                  {
                      Console.WriteLine("computing "+a+"+"+b+"....");
                      Thread.Sleep(9000);//模擬方法進行9秒
                      Console.WriteLine("computing complete");
                      return a + b;
                   }
      }

 

異步調用加入回調函數程序實現

class Program
       {
             //**************異步回調***********
             //用回調函數,當調用結束時會自動調用回調函數,解決了為等待調用結果,而讓線程依舊被阻塞的局面。

            //注意: BeginInvoke和EndInvoke必須成對調用.即使不需要返回值,但EndInvoke還是必須調用,否則可能會造成內存洩漏。
            public delegate int AddHandler(int a, int b);
            static void Main(string[] args)
                    {
                         Console.WriteLine("********(異步回調調用)AsyncInvokeTest******");
                         AddHandler handler = new AddHandler(Add);
                         IAsyncResult result = handler.BeginInvoke(1, 2, new AsyncCallback(AddComplete),"AsycState:OK");
                         Console.WriteLine("(繼續做其他的事)do other work...");
                         // Console.WriteLine(handler.EndInvoke(result));//對於每個異步操作只能調用一次EndInvoke()方法。
                         Console.ReadLine();
                     }

              private static int Add(int a, int b)
                     {
                         Console.WriteLine("computing " + a + "+" + b + "....");
                         Thread.Sleep(3000);//模擬方法進行9秒
                          Console.WriteLine("computing complete");
                         return a + b;
                     }

             static void AddComplete(IAsyncResult result)//異步回調函數
                    {
                        AddHandler handler = (AddHandler) ((AsyncResult) result).AsyncDelegate;
                       Console.WriteLine(handler.EndInvoke(result));
                       Console.WriteLine(result.AsyncState);
                     }
             //異步委托,也可以參考如下寫法:
            //Action<object> action=(obj)=>method(obj);
            //action.BeginInvoke(obj,ar=>action.EndInvoke(ar),null);
           //簡簡單單兩句話就可以完成一部操作。
       }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved