1. 程式人生 > >非同步程式設計之委託

非同步程式設計之委託

前言:

專案中由於大量的資料讀取操作,導致每次載入介面都需要長時間等待,因此決定使用非同步來獲取資料,實現更好的使用者體驗。

趁此機會,也好好的補充一下自己在非同步程式設計方面的知識!

先從委託開始說起!

委託的定義:

委託是一個類,它定義了方法的型別,使得可以將方法當作另一個方法的引數來進行傳遞。

委託的特點:

委託類似於 C++ 函式指標,但它們是型別安全的。委託允許將方法作為引數進行傳遞。委託可用於定義回撥方法。方法不必與委託簽名完全匹配。

委託的宣告:

(1). delegate

        delegate我們常用到的一種宣告

    Delegate至少0個引數,至多32個引數,可以無返回值,也可以指定返回值型別。

    例:public delegate int MethodtDelegate(int x, int y);表示有兩個引數,並返回int型。

(2). Action

       Action是無返回值的泛型委託。

   Action 表示無參,無返回值的委託

   Action<int,string> 表示有傳入引數int,string無返回值的委託

   Action<int,string,bool> 表示有傳入引數int,string,bool無返回值的委託

       Action<int,int,int,int> 表示有傳入4個int型引數,無返回值的委託

   Action至少0個引數,至多16個引數,無返回值。

   例:

public void Test<T>(Action<T> action,T p)
        {
            action(p);
        }

 (3). Func

   Func是有返回值的泛型委託

   Func<int> 表示無參,返回值為int的委託

   Func<object,string,int> 表示傳入引數為object, string 返回值為int的委託

   Func<object,string,int> 表示傳入引數為object, string 返回值為int的委託

   Func<T1,T2,,T3,int> 表示傳入引數為T1,T2,,T3(泛型)返回值為int的委託

   Func至少0個引數,至多16個引數,根據返回值泛型返回。必須有返回值,不可void

      例: 

public int Test<T1,T2>(Func<T1,T2,int>func,T1 a,T2 b)
        {
            return func(a, b);
        }

(4) .predicate

   predicate 是返回bool型的泛型委託

   predicate<int> 表示傳入引數為int 返回bool的委託

   Predicate有且只有一個引數,返回值固定為bool

   例:public delegate bool Predicate<T> (T obj)

委託的使用:

(1).Delegate的使用

public delegate int MethodDelegate(int x, int y);
        private static MethodDelegate method;
        static void Main(string[] args)
        {
            method = new MethodDelegate(Add);
            Console.WriteLine(method(10,20));
            Console.ReadKey();
        }

        private static int Add(int x, int y)
        {
            return x + y;
        }

結果:

個人想法:委託就像一個統一的類,可以把所有引數和返回值相同的方法統一起來進行呼叫。

(2).Action的使用

 static void Main(string[] args)
        {
            Test<string>(Action,"Hello World!");
            Test<int>(Action, 1000);
            Test<string>(p => { Console.WriteLine("{0}", p); }, "Hello World");//使用Lambda表示式定義委託
            Console.ReadKey();
        }
        public static void Test<T>(Action<T> action, T p)
        {
            action(p);
        }
        private static void Action(string s)
        {
            Console.WriteLine(s);
        }
        private static void Action(int s)
        {
            Console.WriteLine(s);
        }

結果:

(3).Func的使用

static void Main(string[] args)
        {
            Console.WriteLine(Test<int,int>(Fun,100,200));
            Console.ReadKey();
        }
        public static int Test<T1, T2>(Func<T1, T2, int> func, T1 a, T2 b)
        {
            return func(a, b);
        }
        private static int Fun(int a, int b)
        {
            return a + b;
        }

結果:

(4). predicate的使用

static void Main(string[] args)
        {
            Point point1 = new Point() { X = 100, Y = 200 };
            Point point2 = new Point() { X = 1000, Y = 200 };
            Console.WriteLine(Test<Point>(ProductGT10,point1));
            Console.WriteLine(Test<Point>(ProductGT10, point2));
            Console.ReadKey();
        }
        public static bool Test<T>(Predicate<T> predicate, T p)
        {
            return predicate(p);
        }
        private static bool ProductGT10(Point p)
        {
            if (p.X * p.Y > 100000)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

結果: