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();
            }
  • 相关阅读:
    css 之优先策略
    SpringCloud WebUploader 分块上传
    SpringBoot WebUploader 分块上传
    java WebUploader 分块上传
    php WebUploader 分块上传
    jsp WebUploader 分块上传
    csharp WebUploader 分块上传
    c# WebUploader 分块上传
    .net WebUploader 分块上传
    c#.net WebUploader 分块上传
  • 原文地址:https://www.cnblogs.com/yangxi1081/p/9634678.html
Copyright © 2011-2022 走看看