C# 委託的三種調用示例(同步調用 異步調用 異步回調) 之 FUNC 版

 

園子裏,一篇精典 介紹 C#委託方法是基於傳統定義委託,並實現 調用。但C# 5.0 提供了泛型委託,能更高效的調用,本人引用原代碼,進行改寫異步

供你們參考函數

 

 

 public class 加法類
    {
        public static int Add(int a, int b)
        {
            Console.WriteLine("開始計算:" + a + "+" + b);
            Thread.Sleep(3000); //模擬該方法運行三秒
            Console.WriteLine("計算完成!");
            return a + b;
        }
    }

    public class 同步調用
    {
        static void Main()
        {
            Console.WriteLine("===== 同步調用 SyncInvokeTest =====");
            Func<int, int,int> handler = 加法類.Add;
            int result = handler(1, 2);

            Console.WriteLine("繼續作別的事情。。。");
            Console.WriteLine(result);
            Console.ReadKey();
        }
    }
    public class 異步調用
    {
        static void Main()
        {
            Console.WriteLine("===== 異步調用 AsyncInvokeTest =====");
            Func<int, int,int> handler = 加法類.Add;
            //IAsyncResult: 異步操做接口(interface)
            //BeginInvoke: 委託(delegate)的一個異步方法的開始
            IAsyncResult result = handler.BeginInvoke(1, 2, null, null);
            Console.WriteLine("繼續作別的事情。。。");
            //異步操做返回
            Console.WriteLine(handler.EndInvoke(result));
            Console.ReadKey();
        }
    }
    public class 異步回調
    {
        static void Main()
        {
            Console.WriteLine("===== 異步回調 AsyncInvokeTest =====");
            Func<int, int, int> handler = 加法類.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;
            Func<int, int, int> handler = (Func<int, int, int>)((AsyncResult)result).AsyncDelegate; ;
            Console.WriteLine(handler.EndInvoke(result));
            Console.WriteLine(result.AsyncState);
        }
    }
相關文章
相關標籤/搜索