同步调用和异步调用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秒的时候,我继续执行我下面的代码,你延迟你的我不管,我不等你,等你到猴年马月了,我继续做我的事情
您可能感兴趣的文章
- 01-10Extjs4如何处理后台json数据中日期和时间
- 01-10C#调用dos窗口获取相关信息的方法
- 01-10C#及WPF获取本机所有字体和颜色的方法
- 01-10C#调用WebService实例开发
- 01-10C#编程自学之数据类型和变量二
- 01-10C#编程自学之数据类型和变量三
- 01-10C#编程自学之运算符和表达式
- 01-10C#装箱和拆箱原理详解
- 01-10C#编程自学之类和对象
- 01-10C++调用C#的DLL程序实现方法
阅读排行
本栏相关
- 01-10C#通过反射获取当前工程中所有窗体并
- 01-10关于ASP网页无法打开的解决方案
- 01-10WinForm限制窗体不能移到屏幕外的方法
- 01-10WinForm绘制圆角的方法
- 01-10C#实现txt定位指定行完整实例
- 01-10WinForm实现仿视频 器左下角滚动新
- 01-10C#停止线程的方法
- 01-10C#实现清空回收站的方法
- 01-10C#通过重写Panel改变边框颜色与宽度的
- 01-10C#实现读取注册表监控当前操作系统已
随机阅读
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法实例总结
- 04-02jquery与jsp,用jquery
- 01-11ajax实现页面的局部加载
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-10SublimeText编译C开发环境设置
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 08-05dedecms(织梦)副栏目数量限制代码修改