微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

同步调用WebService和异步调用WebService

转自红黑联盟,原址http://www.2cto.com/kf/201203/125603.html

阅读目录

  一:同步调用

  二:异步调用

  三:同步调用WebService

  四:异步调用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 > 0)
         {
             Thread.Sleep(intDelaySecond * 1000);
         }
         int intGrade = 0;
         switch (strName)
         {
             case "张三":
                intGrade = 90;
                break;
             case "李四":
                intGrade = 80;
                break;
             case "王五":
                intGrade = 70;
                break;
             case "贾六":
                intGrade = 60;
                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());
       #region 同步调用开始 www.2cto.com
       Console.WriteLine("同步调用开始");
       Console.WriteLine("同步调用结果为:" + service.GetGrade(strName,intSecond));
       Console.WriteLine("同步调用结束");

   Console.ReadLine();
       #endregion

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

\




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


  
 

四:异步调用WebService

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

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

  . 不需要进行额外的编程

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

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

   #region 异步调用
       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 = 0; i < 3; i++)
       {
             Console.WriteLine(i);
       }
       Console.ReadLine();
        #endregion

     private static void service_Completed(object sender,AsynCall.GetGradeCompletedEventArgs e)
        {
            Console.WriteLine("异步调用结果为:" + e.Result);
            Console.WriteLine("异步调用结束");
        }

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


 
  


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

 
  每天学习一点点,每天进步一点点 用文字记录工作,用文字记录人生

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐