c#非同步呼叫和回調__c#

來源:互聯網
上載者:User
C#非同步委託(非同步方法呼叫調用)一:同步調用 : 程式順序執行時-->調用很耗時的[方法]-->阻塞當前線程-->[方法]調用完成-->繼續執行。非同步呼叫 : --------------------------------------------------------------------------------委託例子 :     自寫委託如下 :     public delegate String MyDelegate(String name);    微軟會自動提供下面兩個方法 :     IAsyncResult BeginInvoke(String name, AsyncResult callback, Object o);    String EndInvoke(IAsyncResult result);--------------------------------------------------------------------------------每個委託都有3個方法 :     Invoke      : 是委託指定函數的同步調用;    BeginInvoke : 是非同步呼叫, 調用後立即返回,不等待調用結果    EndInvoke   : 是非同步呼叫, 用於檢索調用結果。調用BeginInvoke後可隨時調用, 它將一直阻塞到非同步呼叫完成。AsyncCallback 委託 : 用於指定在開始操作完成後應被調用的方法。IAsyncResult 介面  : 用於監視和管理非同步作業。public interface IAsyncResult{    Object AsyncState { get; }              // 該屬性為BeginInvoke參數中的最後一個參數對象    WaitHandle AsyncWaitHandle { get; }     //     bool CompletedSynchronously { get; }    // 如果開始操作調用已同步完成,則其屬性將被設定為 true。    bool IsCompleted { get; }               // 該屬性判斷非同步呼叫是否結束}--------------------------------------------------------------------------------例子 : 1) 定義一個委託 :    using System.Threading;    using System.Runtime.Remoting.Messaging;    public delegate int AddHandler(int a,int b);    public class 加法類    {        public static int Add(int a, int b)        {            Console.WriteLine("開始計算:" + a + "+" + b);            Thread.Sleep(3000); //類比該方法運行三秒            Console.WriteLine("計算完成。");            return a + b;        }    }2) 同步調用 : 委託的Invoke方法用來進行同步調用。同步調用也可以叫阻塞調用,它將阻塞當前線程,然後執行調用,調用完畢後再繼續向下進行。    public class 同步調用    {        static void Main()        {            Console.WriteLine("===== 同步調用 SyncInvokeTest =====");            AddHandler handler = new AddHandler(加法類.Add);            int result = handler.Invoke(1, 2);            Console.WriteLine("繼續做別的事情。。。");            Console.WriteLine(result);            Console.ReadKey();        }        /*運行結果:         ===== 同步調用 SyncInvokeTest =====         開始計算:1+2         計算完成。         繼續做別的事情。。。         3       */    }3) 非同步呼叫 : 非同步呼叫不阻塞線程,而是把調用塞到線程池中,程式主線程或UI線程可以繼續執行。委託的非同步呼叫通過BeginInvoke和EndInvoke來實現。    public class 非同步呼叫    {        static void Main()        {            Console.WriteLine("===== 非同步呼叫 AsyncInvokeTest =====");            AddHandler handler = new AddHandler(加法類.Add);            //IAsyncResult: 非同步作業介面(interface)            //BeginInvoke: 委託(delegate)的一個非同步方法呼叫的開始            IAsyncResult result = handler.BeginInvoke(1, 2, null, null);            Console.WriteLine("繼續做別的事情。。。");            //非同步作業返回            Console.WriteLine(handler.EndInvoke(result));            Console.ReadKey();        }        /*運行結果:         ===== 非同步呼叫 AsyncInvokeTest =====         繼續做別的事情。。。         開始計算:1+2         計算完成。         3       */    }4) 非同步回調 : 用回呼函數,當調用結束時會自動調用回呼函數,解決了為等待調用結果,而讓線程依舊被阻塞的局面。    public class 非同步回調    {        static void Main()        {            Console.WriteLine("===== 非同步回調 AsyncInvokeTest =====");            AddHandler handler = new AddHandler(加法類.Add);            //非同步作業介面(注意BeginInvoke方法的不同。)            IAsyncResult result = handler.BeginInvoke(1,2,new AsyncCallback(回呼函數),"AsycState:OK");                        Console.WriteLine("繼續做別的事情。。。");            Console.ReadKey();        }        static void 回呼函數(IAsyncResult result)        {   //result 是“加法類.Add()方法”的傳回值            //AsyncResult 是IAsyncResult介面的一個實作類別,空間:System.Runtime.Remoting.Messaging            //AsyncDelegate 屬性可以強制轉換為使用者定義的委託的實際類。            AddHandler handler = (AddHandler)((AsyncResult)result).AsyncDelegate;            Console.WriteLine(handler.EndInvoke(result));            Console.WriteLine(result.AsyncState);        }        /*運行結果:        ===== 非同步回調 AsyncInvokeTest =====        開始計算:1+2        繼續做別的事情。。。        計算完成。        3        AsycState:OK                 */    }總結 : Invoke方法首先檢查發出調用的線程(即當前線程)是不是UI線程,如果是,直接執行委託指向的方法,如果不是,它將切換到UI線程,然後執行委託指向的方法。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.