zoukankan      html  css  js  c++  java
  • C#中委托的同步和异步有什么区别

    通过定义委托,来实现同步和异步,委托通过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();
            }
  • 相关阅读:
    jquery 源码学习(二)
    附加作业2
    附加题1
    实验八:一维数组的应用
    第七次作业总结
    第七次作业
    实验六:函数
    Thanks for your encourage!
    实验五:循环结构
    作业四 分支结构
  • 原文地址:https://www.cnblogs.com/yangxi1081/p/9634678.html
Copyright © 2011-2022 走看看