1. 程式人生 > >C#委託學習之回撥

C#委託學習之回撥

    委託:

    在c#中定義為:委託就像一個函式的指標,在程式執行時可以使用它們來呼叫不同的函式。

    我的理解就是一個方法,但是需要傳入的引數型別與普通引數不同,需要傳入另一個方法作為引數。

委託的使用:

首先定義一個委託類:public delegate int MethodDel();

然後例項化一個委託:public MethodDel addMethod = new MethodDel(Add);其中Add();方法的返回值與引數必須與定義的委託類的返回值和引數相同。

    使用時可以新增委託鏈:addMethod += Add2;同理也可以進行減等操作

委託的呼叫:

    委託的呼叫分為同步呼叫、非同步呼叫和非同步回撥

    同步呼叫:即使用Invoke();方法。同步呼叫又稱阻塞呼叫,會阻塞當前執行緒。

    非同步呼叫:一步呼叫不會阻塞執行緒,而是把執行緒放到執行緒池中,程式會繼續執行。通過BeginInvoke();EndInvoke();來實現。

但是如果執行到EndInvoke();時,呼叫沒有執行完畢,依然會阻塞執行緒。

    非同步回撥:當呼叫結束時會自動呼叫回到函式,解決了為等待呼叫結果,而讓執行緒依舊被阻塞的局面。

測試程式碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Collections;
using System.Runtime.Remoting.Messaging;

namespace StudyTest
{
    class Program
    {
        public delegate int MethodDel();
        public static MethodDel addMethod = new MethodDel(Add);
        static void Main(string[] args)
        {
            Console.ReadKey();
            addMethod.Invoke();
            Console.WriteLine("同步呼叫完成");

            Console.ReadKey();

            IAsyncResult resule = addMethod.BeginInvoke(null, null);
            Console.WriteLine("做別的事情");
            Console.ReadKey();//代表做別的事情,再次停頓5秒以上
            addMethod.EndInvoke(resule);
            Console.WriteLine("非同步呼叫完成");

            Console.ReadKey();

            IAsyncResult resulet = addMethod.BeginInvoke(new AsyncCallback(回撥函式), "AsycState:OK");
            Console.WriteLine("做別的事情");
            Console.ReadKey();
        }
        public static int Add()
        {
            Thread.Sleep(5000);//代表正在呼叫,停止5秒
            return 3;
        }
        public static void 回撥函式(IAsyncResult result)
        {
            addMethod= (MethodDel)((AsyncResult)result).AsyncDelegate;
            Console.WriteLine(addMethod.EndInvoke(result));
            Console.WriteLine(result.AsyncState);
        }
    }
}