1. 程式人生 > >c# 非同步委託的使用小結

c# 非同步委託的使用小結

非同步委託的使用小結

非同步委託的使用小結

    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");
         getInfo();         
        Console.WriteLine("End!!!");
        Console.Read();
    }
    //不帶返回引數的委託
    public static void getInfo()
    {
        Action<string> act = doSmoething;
        act.Invoke("111111");
         //回掉方法方式1
        // AsyncCallback callback = doSmoething2;            
        //回掉方法方式2 T為委託執行後返回到回掉方法的引數
        AsyncCallback callback = T =>
        {
            Console.WriteLine("3333333" + T);
        };
        //開始執行非同步委託
        IAsyncResult isr = act.BeginInvoke("222222", callback, null);
         //非同步委託的等待如果未執行完那麼會一直等待
        isr.AsyncWaitHandle.WaitOne();
        //只等待兩秒鐘,如果未執行完那麼也不繼續等待
        isr.AsyncWaitHandle.WaitOne(2000);
        Action ac = doSmoething3;
        //不帶引數委託的宣告方式
        Action a = () =>
        {
            Console.Write("我是空引數的委託");
        };
}

    public static void doSmoething(string thing)
    {
        for (int i = 0; i < 100; i++)
        {
            Console.WriteLine($"{thing}");
        }

    }
    public static void doSmoething3( )
    {
        for (int i = 0; i < 100; i++)
        {
            Console.WriteLine($"");
        }

    }
    public static void doSmoething2(IAsyncResult thing)
    {
        for (int i = 0; i < 100; i++)
        {
            Console.WriteLine($"我是非同步的學習      ,狀態為 {thing.AsyncState}");
        }
    }
    //帶返回值的委託
    public static void doFunc() {
    //不帶引數的委託,只有返回值
        Func<string> f4 = () =>
        {
            return "";
        };
        //帶引數與返回值的委託
        Func<string, int> func = b =>
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine($"1111111+++++++1111111+++++{b}");
            }
            return DateTime.Now.Year;
        };
        //宣告回掉方法,t為執行完後的返回值
        AsyncCallback asyncCallback = t =>
        {
            Console.WriteLine("2222222222");
            //當進入到此方法以後說明委託方法已經執行完,已經開始返回,這時呼叫委託的EndInvoke傳入執行完的   						
            結果獲取該委託方法的返回值
            int result = func.EndInvoke(t);
            Console.WriteLine(result);
        }; 
        //呼叫方式1
        //func.BeginInvoke("1", asyncCallback, "");
        //呼叫方式2
     IAsyncResult isy =   func.BeginInvoke("555", t =>
        {
            int end = func.EndInvoke(t);
            Console.WriteLine(end);
        },
        "");
        //單獨執行獲取返回值時,程序會卡在這裡等待委託執行完成。如果不會等待回掉全部執行完就會執行到該方
        法
        int result = func.EndInvoke(isy);
        //等待
        isy.AsyncWaitHandle.WaitOne();
    }
}

}在這裡插入圖片描述