C#中委托的同步和异步有什么区别

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


委托的同步方法异步

委托的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来实现。spa

        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();
        }


异步回调线程

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

        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();
        }
相关文章
相关标签/搜索