同步调用和异步调用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秒的时候,我继续执行我下面的代码,你延迟你的我不管,我不等你,等你到猴年马月了,我继续做我的事情


猜你喜欢
- 一、跨域认证的问题互联网服务离不开用户认证。一般流程是下面这样。1、用户向服务器发送用户名和密码。2、服务器验证通过后,在当前对话(sess
- 只要是面向对象的编程语言,基本上都有类Class的用法,只是好不好用,好不好记而已,面向对象是c++开始引入的,但是c++ 关于类的东西,弄
- 一、对象的创建1.1 new 类名虚拟机遇到一条new指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并检查这个符号引
- 本文浅析了C#的复制和克隆技术,对于有需要的朋友可以参考下。在C#中,用HashTable,DataTable等实现复制和克隆,下面直接看例
- 前言:在java的网络通信中,两个不同节点的主机想要进行通信则可以通过建立Socket对象(相当于客户端主机,向服务端请求发送信息)和Ser
- 前言RadioGroup是继承LinearLayout,只支持横向或者竖向两种布局。所以在某些情况,比如多行多列布局,RadioGroup就
- 本文实例为大家分享了Android分类侧滑菜单的制作方法,供大家参考,具体内容如下classificmenuActivity.java代码:
- 1、Nacos config springboot starter包我们在springboot应用中集成nacos配置中心时,添加了以下依赖
- 本文实例为大家分享了C#使用Chart绘制曲线的具体代码,供大家参考,具体内容如下新建一个控制台应用程序,程序名:WindowsFormsA
- 前言本篇文章讲的是Kotlin 自定义view之实现标尺控件Ruler,以选择身高、体重等。开发中,当我们需要获取用户的身高和体重等信息时,
- 本文实现android系统照相机的调用来拍照项目的布局相当简单,只有一个Button:<RelativeLayout xmlns:an
- 前言ParametersInterceptor * 其主要功能是把ActionContext中的请求参数设置到ValueStack中,如果栈
- 摘要在我们使用MyBatis的过程中,如果所有实体类和单表CRUD代码都需要手写,那将会是一件相当麻烦的事情。MyBatis官方代码生成器M
- 1.android 消息循环有4个重要的类Handler、Message、Looper、MessageQueuehandler 用来发送、处
- TIOBE 11 月编程语言排行榜,Python 逆袭C#曾经有一段时间,脚本语言因其易于编写和易于运行的特性,被预测在未来将发展强大。因此
- 本文实例讲述了java实现mp3合并的方法。分享给大家供大家参考。具体实现方法如下:package test;import java.io.
- 问题:Kotlin升级引起的类找不到情况[其实跟Kotlin版本无关]java.lang.NoClassDefFoundError: Fai
- 什么是POM?POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示,名称叫做p
- 本文实例为大家分享了android Matrix图片随意放大缩小和拖动的具体代码,供大家参考,具体内容如下step1:新建一个项目DragA
- 有时候在配置中心有些参数是需要修改的,这时候如何不重启而达到实时生效的效果呢?添加依赖<dependencies>