同步调用和异步调用WebService


异步,说到异步需要首先将以下同步。同步就是代码按照顺序执行,当前面的代码的请求没有正常返回结果的情况下,后面的代码是不能运行。而异步正好和这点不同,异步是代码运行后,不管当前的请求是否返回结果,后面的代码都会继续运行。

一:同步调用

    一个同步操作会阻塞整个当前的进程,直到这个操作完成才能执行下一段代码  

  二:异步调用

    不会阻塞启动操作的调用线程,调用程序必须通过轮流检测,或者等待完成信号来发现调用的完成  

  三:同步调用WebService

    同步调用WebService就是我们平常的调用的写法

      1:AsynCall.asmx的AsynCall.cs代码 

/// <summary>
    /// 根据学生姓名得到该学生的成绩
    /// </summary>
    /// <param name="strName">学生姓名</param>
    /// <param name="intDelaySecond">延迟的秒数</param>
    /// <returns>成绩</returns>
    [WebMethod]
    public int GetGrade(string strName, int intDelaySecond)
    {
     if (intDelaySecond > )
     {
       Thread.Sleep(intDelaySecond * );
     }
     int intGrade = ;
     switch (strName)
     {
       case "张三":
         intGrade = ;
         break;
       case "李四":
         intGrade = ;
         break;
       case "王五":
         intGrade = ;
         break;
       case "贾六":
         intGrade = ;
         break;
     }
     return intGrade;
   }

      2:Program.cs

AsynCall.AsynCall service = new AsynCall.AsynCall();
     Console.WriteLine("请输入要查询成绩的学生的姓名:");
     string strName = Console.ReadLine();
     Console.WriteLine("请输入要延迟的秒数:");
     int intSecond = int.Parse(Console.ReadLine());   
     Console.WriteLine("同步调用开始");
     Console.WriteLine("同步调用结果为:" + service.GetGrade(strName, intSecond));
     Console.WriteLine("同步调用结束");
     Console.ReadLine();

      我们输入30秒看看运行效果

      

      因为我们输入的是30秒,所以我们要等到30秒后才能输出“同步调用结果为:90”和“同步调用结束”这两句话

      

  四:异步调用WebService

    . .NET Framework为异步化的编程模型提供了必要的服务

    . 决定特定的调用是否应该异步处理是由客户端也就是调用者决定,我们看到WebService本身并没有发生变化,发生变化的是客户端,是调用端

    . 不需要进行额外的编程

    . 代理类提供了WebService的方法名+Async()作为异步调用WebService的方法名

    . 异步调用的实质是调用者线程和被调用者线程并行执行的过程

 Console.WriteLine("异步调用开始");


     //'+='表示事件的预定,'new AsynCall.GetGradeCompletedEventHandler(service_Completed)'表示利用编写的事件处理程序生成一个委托实例,'service.GetGradeCompleted'表示添加什么到产生事件对象的事件列表当中去,合起来解释就是把这个委托实例添加到产生事件对象的事件列表当中去,这个过程叫做订阅事件,委托就是代理,我们可以这样理解,委托就是把一个事件处理函数和一个事件关联起来
     service.GetGradeCompleted += new AsynCall.GetGradeCompletedEventHandler(service_Completed);
     //开始异步调用
     service.GetGradeAsync(strName, intSecond);
     Console.WriteLine("当前进程没有被阻塞");
     for (int i = ; i < ; i++)
     {
       Console.WriteLine(i);
    }
    Console.ReadLine();
 
    private static void service_Completed(object sender, AsynCall.GetGradeCompletedEventArgs e)
    {
       Console.WriteLine("异步调用结果为:" + e.Result);
       Console.WriteLine("异步调用结束");
    }

    我们同样输入30秒看看运行效果

    

    因为我们输入的还是30秒,所以我们要等到30秒后才能输出“异步调用结果为:90”这句话,这是谁也改变不了的,但是和同步调用不同之处在于,“当前进程没有被阻塞”和for循环立即就输出了,所以证明你在延迟30秒的时候,我继续执行我下面的代码,你延迟你的我不管,我不等你,等你到猴年马月了,我继续做我的事情

    



相关阅读:
在JavaScript中操作时间之getMonth()方法的使用
Linux常用的磁盘管理及文件目录管理命令总结
php post大量数据时发现数据丢失问题解决方法
oracle数据库常用的99条查询语句
sql中count或sum为条件的查询示例(sql查询count)
Win10如何安装和卸载远程服务器管理工具
SeaJS入门教程系列之使用SeaJS(二)
PL/SQL Dev连接Oracle弹出空白提示框的解决方法分享
php使用fopen创建utf8编码文件的方法
学习JavaScript设计模式之模板方法模式
thinkphp配置文件路径的实现方法
Java中for、while、do while三种循环语句的区别介绍
php定界符<<<使用技巧和实例
javascript中闭包(Closure)详解
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 活着 是一种心态 高三学生看过来 高考作文十大问题十大对策 修辞复习指导 【精品】部门经理竞聘演讲稿 《永恒的爱》(陕西大荔李喜来) 说“我”作文900字 物业实习报告范文精选 骂自己无能的话_骂自己贱的话精选 雪花拼图真好玩 关于档案与民生征文范文精选 二年级试卷:小学语文第四册期末试卷(二) 小学六年级作文650字:班级趣事 2 琼瑶不是好老师 真诚就像露天下种的蔬菜 炒板栗 小学五年级作文400字:人生路上的好老师 好语 理财规划书 秋日的私语作文300字 工会工作集体典型事迹材料 大学生军训总结报告 一盘嫩菠菜 初中初一作文750字:西瓜派之寻找历险(11) 巴黎文化产业的现状、特征与发展空间 店面租赁合同(精简版) 小草的心 环境污染的句子 观海老龙头作文800字 感谢黑暗作文550字 小笨蛋和小聪明 公司营销部工作总结 “严纪律,抓学风”全面创新服务型团总支工作方案 黑板报资料—新学期寄语 关于爱情的句子 那些以前说着永不分离的人,早已经散落在天涯了 “只要去试,成功就有希望” 《雷锋的故事》读后感 小学六年级作文600字:观阅兵式有感 风雨兰作文500字 教师自我鉴定总结 2013新年祝福祝福语大全 我流泪 高考满分作文1000字_拒绝平庸 风沙渡 三八节作文1200字 人音版六年级上册 大中国教案 “严以律己”研讨会发言稿:严于律己 敬畏为先 我们有口风琴了 秋天的景色 《短行随想》 中国,我想对你说 我爱我的野蛮同学作文500字

Copyright © 2016 phpStudy |