异步,说到异步需要首先将以下同步。同步就是代码按照顺序执行,当前面的代码的请求没有正常返回结果的情况下,后面的代码是不能运行。而异步正好和这点不同,异步是代码运行后,不管当前的请求是否返回结果,后面的代码都会继续运行。
一:同步调用
一个同步操作会阻塞整个当前的进程,直到这个操作完成才能执行下一段代码
二:异步调用
不会阻塞启动操作的调用线程,调用程序必须通过轮流检测,或者等待完成信号来发现调用的完成
三:同步调用webservice
同步调用webservice就是我们平常的调用的写法
1:asyncall.asmx的asyncall.cs代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
/// <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
1
2
3
4
5
6
7
8
9
|
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的方法名
. 异步调用的实质是调用者线程和被调用者线程并行执行的过程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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秒的时候,我继续执行我下面的代码,你延迟你的我不管,我不等你,等你到猴年马月了,我继续做我的事情