通过定义委托,来实现同步和异步,委托通过Action和Func来实现,记录学习委托的同步和异步的过程


委托的同步方法

委托的Invoke方法用来进行同步调用。

        static void Main(string[] args)
        {
            //无参数方法
            Action action = () => Console.WriteLine("action方法执行");

            action.Invoke();

            //有一个参数(多个参数基本相同)
            Action<string> action2 = (t) => Console.WriteLine("action方法执行,{0}", t);

            action2.Invoke("我在测试");

            //带一个参数带返回值
            Func<int, bool> func = (t) => {

                int i = new Random().Next(1, 10);
                Console.WriteLine("随机数是{0}", i);
                return i > t;
                };
            bool b = func.Invoke(5);
            Console.WriteLine("{0}",b);


            Console.Read();
        }

同步调用会阻塞线程,如果是要调用一项繁重的工作(如大量IO操作),可能会让程序停顿很长时间,造成糟糕的用户体验,这时候异步调用就很有必要了。


委托的异步调用

异步调用不阻塞线程,而是把调用塞到线程池中,程序主线程或UI线程可以继续执行。委托的异步调用通过BeginInvoke和EndInvoke来实现。

        static void Main(string[] args)
        {
            //无参数方法
            Action action = () => Console.WriteLine("action方法执行");

            action.BeginInvoke(null,null);

            //有一个参数(多个参数基本相同)
            Action<string> action2 = (t) => Console.WriteLine("action方法执行,{0}", t);

            action2.BeginInvoke("我是个测试",null,null);

            //带一个参数带返回值
            Func<int, bool> func = (t) => {

                int i = new Random().Next(1, 10);
                Console.WriteLine("随机数是{0}", i);
                return i > t;
                };
            var result = func.BeginInvoke(5,null,null);

            bool b = func.EndInvoke(result);

            Console.WriteLine("{0}",b);

            Console.Read();
        }


异步回调

用回调函数,当调用结束时会自动调用回调函数,解决了为等待调用结果,而让线程依旧被阻塞的局面。

        static void Main(string[] args)
        {
            //无参数方法
            Action action = () => Console.WriteLine("action方法执行");

            AsyncCallback callback1 = t =>
            {
                Console.WriteLine("我是回调1");
            };

            action.BeginInvoke(callback1, null);

            //有一个参数(多个参数基本相同)
            Action<string> action2 = (t) => Console.WriteLine("action方法执行,{0}", t);
            AsyncCallback callback2 = t =>
            {
                Console.WriteLine("我是回调2");
            };
            action2.BeginInvoke("我是个测试", callback2, null);

            //带一个参数带返回值
            Func<int, bool> func = (t) => {

                int i = new Random().Next(1, 10);
                Console.WriteLine("随机数是{0}", i);
                return i > t;

                };
            AsyncCallback callback3 = t =>
            {
                Console.WriteLine("我是回调3");
            };
            var result = func.BeginInvoke(5, callback3, null);

            bool b = func.EndInvoke(result);

            Console.WriteLine("{0}",b);

            Console.Read();
        }