同步调用和异步调用WebService
作者:mrr 发布时间:2022-11-27 07:10:03
异步,说到异步需要首先将以下同步。同步就是代码按照顺序执行,当前面的代码的请求没有正常返回结果的情况下,后面的代码是不能运行。而异步正好和这点不同,异步是代码运行后,不管当前的请求是否返回结果,后面的代码都会继续运行。
一:同步调用
一个同步操作会阻塞整个当前的进程,直到这个操作完成才能执行下一段代码
二:异步调用
不会阻塞启动操作的调用线程,调用程序必须通过轮流检测,或者等待完成信号来发现调用的完成
三:同步调用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秒的时候,我继续执行我下面的代码,你延迟你的我不管,我不等你,等你到猴年马月了,我继续做我的事情
猜你喜欢
- 网络爬虫在信息检索与处理中有很大的作用,是收集网络信息的重要工具。接下来就介绍一下爬虫的简单实现。爬虫的工作流程如下爬虫自指定的URL地址开
- 一、TimeZone 简介TimeZone 表示时区偏移量,也可以计算夏令时。在操作 Date, Calendar等表示日期/时间的对象时,
- 前言前天工作中遇到了这样一个问题,我在接口的参数封装了一个pojo,这是很常见的,当参数一多,惯性的思维就是封装一个pojo.那么在参数前有
- spring Boot的学习持续进行中。前面两篇博客我们介绍了如何使用Spring Boot容器搭建Web项目以及怎样为我们的Project
- @Profile注解详解@Profile:Spring为我们提供的可以根据当前环境,动态的激活和切换一系列组件的功能;开发环境develop
- mybatis自动生成代码(实体类、Dao接口等)是很成熟的了,就是使用mybatis-generator插件。 它是一个开源的插件,使用m
- 一、准备工作小编今天以 QQ邮箱 进行演示操作。想要使用代码操作邮箱发送邮件,需要在邮箱设置中申请开通 POP3/SMTP 服务。接下来跟着
- 配置java环境变量这里是将环境变量配置在etc/profile,即为所有用户配置JDK环境。sudo vi /etc/profile配置环
- 1、输出矩形以此矩形案例(4行,9列的矩形)为例public static void main(String[] args) {  
- 今天本文与大家分享如何得到数组中的最大值和最小值的实例。很适合Java初学者复习数组的基本用法与流程控制语句的使用。具体如下:这个程序主要是
- 本文实例为大家分享了java pdf加水印的具体代码,供大家参考,具体内容如下引入依赖<dependency> <grou
- NO.1–注释在程序中,尤其是复杂的程序中,适当地加入注释可以增加程序的可读性,有利于程序的修改、调试和交流。注释的内容
- 前言记一次为了节省代码没有在方法体中声明HttpServletRequest,而用autowire直接注入所钻的坑结论:给心急的人。 直接在
- 引言用过Spring Cloud的同学都知道在使用动态配置刷新的我们要配置一个 @RefreshScope,在类上才可以实现对象属性的的动态
- Spark的算子的分类从大方向来说,Spark 算子大致可以分为以下两类:1)Transformation 变换/转换算子:这种变换并不触发
- jedis是redis的java客户端,spring将redis连接池作为一个bean配置。redis连接池分为两种,一种是“redis.c
- 什么是冒泡排序冒泡排序指重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从小到大)错误就把他们交换过来。走访元素的工作是重复
- public void ProcessRequest (HttpContext context) { &n
- 谨记:Url表只储存受保护的资源,不在表里的资源说明不受保护,任何人都可以访问1、MyFilterInvocationSecurityMet
- 导入redis的jar包<!-- redis --> <dependency>