同步调用   : 委托的Invoke方法用来进行同步调用。同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行。

异步调用  :同步调用会阻塞线程,如果是要调用一项繁重的工作(如大量IO操作),可能会让程序停顿很长时间,造成糟糕
的用户体验,这时候异步调用就很有必要了。
异步调用不阻塞线程,而是把调用塞到线程池中,程序主线程或UI线程可以继续执行。
委托的异步调用通过BeginInvoke和EndInvoke来实现。

异步回调函数  :当异步调用时,主线程并没有等待,而是直接向下运行了。
但是问题依然存在,当主线程运行到EndInvoke时,如果这时调用没有结束(这种情况很可能出现),这时为了等待调用结果,线程依旧会被阻塞。
解决的办法是用回调函数,当调用结束时会自动调用回调函数

同步调用程序实现

class Program
      {
          //同步调用
          //委托的Invoke方法用来进行同步调用。同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行。
           public delegate int AddHandler(int a,int b);//声明委托
           static void Main(string[] args)
                {
                     Console.WriteLine("*******(同步调用)SyncInvokeTest*******");
                     AddHandler handler = new AddHandler(Add);//定义委托,传入参数
                     int result = handler.Invoke(1, 2);//委托的同步调用,主线程执行到此时停止,即阻塞。调用同步调用委托的的方法,执行此方法。
                     Console.WriteLine("(继续做其他的事)Do other work.....");//other work 是指Add方法,进行两数相加操作。
                     Console.WriteLine(result);
                     Console.ReadLine();
                 }

private static int Add(int a, int b)//一个加法方法是一个线程
                 {
                     Console.WriteLine("Computing"+a+" + "+b+"...");
                     Thread.Sleep(9000);//模拟方法进行9秒
                     Console.WriteLine("computing complete.");
                     return a + b;
                  }
      }

异步调用程序实现

class Program
        {
             //**************异步调用***********
            //异步调用不阻塞线程,而是把调用塞到线程池中,程序主线程或UI线程可以继续执行。
            //委托的异步调用通过BeginInvoke和EndInvoke来实现。
            public delegate int AddHandler(int a,int b);
            static void Main(string[] args)
                  {
                       Console.WriteLine("********(异步调用)AsyncInvokeTest******");
                       AddHandler handler = new AddHandler(Add);
                       IAsyncResult result = handler.BeginInvoke(1, 2, null, null);
                       Console.WriteLine("(继续做其他的事)do other work...");
                       Console.WriteLine(handler.EndInvoke(result));
                       Console.ReadLine();
                   }

private static int Add(int a, int b)
                  {
                      Console.WriteLine("computing "+a+"+"+b+"....");
                      Thread.Sleep(9000);//模拟方法进行9秒
                      Console.WriteLine("computing complete");
                      return a + b;
                   }
      }

异步调用加入回调函数程序实现

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

//注意: BeginInvoke和EndInvoke必须成对调用.即使不需要返回值,但EndInvoke还是必须调用,否则可能会造成内存泄漏。
            public delegate int AddHandler(int a, int b);
            static void Main(string[] args)
                    {
                         Console.WriteLine("********(异步回调调用)AsyncInvokeTest******");
                         AddHandler handler = new AddHandler(Add);
                         IAsyncResult result = handler.BeginInvoke(1, 2, new AsyncCallback(AddComplete),"AsycState:OK");
                         Console.WriteLine("(继续做其他的事)do other work...");
                         // Console.WriteLine(handler.EndInvoke(result));//对于每个异步操作只能调用一次EndInvoke()方法。
                         Console.ReadLine();
                     }

private static int Add(int a, int b)
                     {
                         Console.WriteLine("computing " + a + "+" + b + "....");
                         Thread.Sleep(3000);//模拟方法进行9秒
                          Console.WriteLine("computing complete");
                         return a + b;
                     }

static void AddComplete(IAsyncResult result)//异步回调函数
                    {
                        AddHandler handler = (AddHandler) ((AsyncResult) result).AsyncDelegate;
                       Console.WriteLine(handler.EndInvoke(result));
                       Console.WriteLine(result.AsyncState);
                     }
             //异步委托,也可以参考如下写法:
            //Action<object> action=(obj)=>method(obj);
            //action.BeginInvoke(obj,ar=>action.EndInvoke(ar),null);
           //简简单单两句话就可以完成一部操作。
       }

多线程是为了提高用户体验,解决窗体界面假死状态的好的选择。同步线程是阻塞线程,对提高用户体验和界面假死没什么帮助。异步线程才可以提高程序的性能,和用户体验。平时说的多线程是指异步线程。

C# 同步调用 异步调用 异步回调 多线程的作用的更多相关文章

  1. C#(同步调用、异步调用、异步回调)

    Review: 原作者虽然使用了汉字的类名,看起来十分蹩脚,但是,还是把同步调用.异步调用.异步回调的使用讲解的很详细的.原理讲解的很清晰. ------ 本文将主要通过“同步调用”.“异步调用”.“ ...

  2. java常见的几种调用机制(同步调用,异步调用,回调)

    1.同步调用 同步调用是最基本的调用方式,对象b中的方法直接调用对象a的方法,这个时候程序会等待对象a的方法执行完返回结果之后才会继续往下走. 代码如下: public class A {public ...

  3. Python并发编程06 /阻塞、异步调用/同步调用、异步回调函数、线程queue、事件event、协程

    Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件event.协程 目录 Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件 ...

  4. 委托(delegate)的三种调用方式:同步调用,异步调用,异步回调(转载)

    下面为即将被调用的方法: public delegate int AddHandler(int a,int b); public class 加法类 { public static int Add(i ...

  5. java三种调用方式(同步调用/回调/异步调用)

    1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 3:异步调用:一种类似消息或事件的机制 ...

  6. C#“同步调用”、“异步调用”、“异步回调”

    本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: ); //模拟该方法运 ...

  7. 整理 C#(同步调用、异步调用、异步回调)

    //闲来无事,巩固同步异步方面的知识,以备后用,特整理如下: class Program { static void Main(string[] args) { //同步调用 会阻塞当前线程,一步一步 ...

  8. C# 委托的三种调用示例(同步调用 异步调用 异步回调)

    首先,通过代码定义一个委托和下面三个示例将要调用的方法: 复制代码 代码如下: public delegate int AddHandler(int a,int b);    public class ...

  9. 用delegate实现.NET应用程序的同步函数的异步调用-.NET多线程编程实践之一

    在C++中有2种类型的线程:UI Thread和Worker Thread,前者是基于用户界面的有消息循环的线程.后者是没有用户界面的侧重于大时空运算的线程.直接调用Windows相关线程及同步对象的 ...

随机推荐

  1. 【NOIP2016提高A组8.12】礼物

    题目 夏川的生日就要到了.作为夏川形式上的男朋友,季堂打算给夏川买一些生日礼物. 商店里一共有种礼物.夏川每得到一种礼物,就会获得相应喜悦值Wi(每种礼物的喜悦值不能重复获得). 每次,店员会按照一定 ...

  2. Dynamic len

    题目 有n个数编号从0→n-1,两种操作: Q L R:询问编号为L→R-1的数中共有多少种不同的数 M X Y:将编号为X的数改为Y 共有m个操作 分析 既然是单点修改,查询,我们考虑一下分块. 首 ...

  3. .Net 网站配置文件 webconfig 配置。 字体图标+视频播放 以及 文件上传

    ASP.NET MVC 上传大文件时404 原来IIS7的上传文件大小,即便是在经典模式下,也一定要在system.webServer里设置,加上去就OK了 <system.webServer& ...

  4. lua脚本入门

    在网上下载一些工程,里边常常存在.lua .sh .in .cmake .bat等文件 今天专门查了一下相关文件的作用 .sh 通常是linux.unix系统下的脚本文件(文本文件),用于调用默认的s ...

  5. JDK1.8 LinkedList双向链表源码

    序言 LinkedList是一个双向链表 也就是说list中的每个元素,在存储自身值之外,还 额外存储了其前一个和后一个元素的地址,所以也就可以很方便地根据当前元素获取到其前后的元素 链表的尾部元素的 ...

  6. webpack学习笔记二

    sourceMap 源代码与打包后的代码的映射关系.例如,在某个源文件中test.js里面有个错误,如果开启状态,那么打包后运行的报错信息就会说明是错误的具体位置,如果是关闭状态,报错后,提示的报错位 ...

  7. [CF1082G]Petya and Graph:最小割

    分析 发这篇博客的目的就是要让你们知道博主到底有多菜. 类似于[NOI2006]最大获利.(明明就是一模一样好吧!) 不知道怎么了,半秒就想到用网络流,却没想出怎么建图. 连这么简单的题都没做出来,我 ...

  8. UE4 质心相关

    Add force 始终给质心施加力,即使手动偏移了质心(Center of mass)也不例外. Add force at location local 相对于物体的原始质心位置增加一个偏移值后的位 ...

  9. UE4 Pro Tips(keeps updating)

    Consolidate 功能 :在工程范围内用一种资源替换另外一种或多种资源具体操作:同时在编辑器中选中两个或多个资源,右键>Asset Actions>Replace Reference ...

  10. es之java删除文档操作

    删除文档操作 @Test public void deleteDocument(){ DeleteResponse response = client.prepareDelete("twit ...