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();
            }
  • 相关阅读:
    Informix IDS 11系统办理(918考试)认证指南,第6部分:IDS备份和恢复(1)
    Informix IDS 11体系处置(918检验)认证指南,第 4 局部: 性能调优(7)
    我常用网址整理
    System.Insert 插入字符串
    System.Length 获取字符串或数组的长度
    System.New、System.Dispose 为某个指针申请和释放内存
    System.GetMem、System.FreeMem 申请和释放内存
    学习 TList 类的实现[1]
    学习 TList 类的实现[2]
    System.ReallocMem 重新申请内存
  • 原文地址:https://www.cnblogs.com/yangxi1081/p/9634678.html
Copyright © 2011-2022 走看看