• 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();
            }
  • 相关阅读:
    margin+absolute布局:右栏固定主内容自适应 demo
    localForage——轻松实现 Web 离线存储
    迷你MVVM框架 avalonjs 1.2.6发布
    收起.NET程序的dll来
    从锅炉工到AI专家 ---- 系列教程
    DevExpress中实现GridControl的分页功能
    树莓派 ---- 个人总结
    树莓派安装内网穿透版花生壳服务
    winform 多线程中ShowDialog()模式窗口无效的解决办法
    局域网匿名访问共享文件
  • 原文地址:https://www.cnblogs.com/yangxi1081/p/9634678.html
Copyright © 2020-2023  润新知