1.异步方法的动机:
(1)、对于同步方法:
UI线程依赖于方法的实现:方法执行时间过长将导致UI无法及时与用户进行交互。
服务器线程受到其他服务器的支配。
(2)、线程是稀缺资源:
在Windows客户端中,每个进程有单一的UI线程。
在服务器中,可扩展性依赖于线程的使用。
(3)、对于异步方法:
在用户交互方面:
提供良好的用户体验。
及时交互响应。
在服务器:
改善可扩展性。
将服务器与通讯问题隔离。
2.客户端异步方法基于Proxy的方法:
(1)、异步行为的最简单类型
缺省方式。
Visual Studio和WSDL.exe直接支持
客户端代理包含异步方法
(2)、效果和影响
改进UI响应度
在服务器不需要实现异步操作(对服务器透明)
客户端能够在任何时间选择阻塞
(3)、WSDL.exe可以生成异步方法
将方法放入调用队列即返回
通用.NET异步编程模式(通过BeginInvoke/EndInvoke实现)
充分利用delegate和IASyncResult特性(BeginXXX和EndXXX,BeginXXX返回IASyncResult(客户端可以轮询,等待,或者delegate方法))
3.客户端异步模型结束状态查询方法
(1)、轮询IASyncResult.IsCompleted以判断处理是否结束
允许客户端继续其他工作
(2)、使用IASyncResult.AsyncWaitHandle
允许客户端使用wait处理语义
(3)、调用delegate方法
等待被运行时调用的delegate
(4)、阻塞调用End方法
最简单模型
4.客户端异步方法-----线程池
(1)、客户端线程池
性能较IAsyncResult略高
对于无响应的请求特别有用
delegate能够被异步调用(WaitCallback)
(2)、QueueUserWorkItem
支持delegate方法调用
可以选择提供参数对象
5.服务器端异步方法
(1)、在服务器端实现异步方法
(2)、实现方式:
BeginInvoke/EndInvoke
Soap one-way方法(单向)
Web Services增强(WSE)
MSMQ
(3)、One-Way
将单向信息发送到端点(例如:不需要响应的请求)。
问题:
没有返回值;无法判断方法结束的时间(对于结果需要显示通知或轮询);
(4)、通知:
从端点发送的单向消息
客户端通知策略:
客户端能够轮询完成状态(要求客户端提供相关令牌,注意可扩展性问题)。
服务器能够通知客户端(WS-Eventing或者类似机制,广播通道)。
(5)、One-Way方法实现:
使用[SoapDocumentMethod]定义one-way方法([SoapDocumengtMethod(OneWay=true)],数据包反序列化后,服务器端方法即返回,客户端方法不会从调用的服务器端方法中收到返回值);
One-Way方法不适用于:
方法需要对结果轮询(其他方法会更加合适);
方法需要同步。
(6)、Web Service增强(WSE)(需要到Microsoft官方网站下载相关的组件与.NET整合)
WSE支持面向消息的编程:
SoapSender和SoapReceiver基类;
支持发送和接收SoapEnvelopes;
更多的事物模型(通过SoapClient和SoapService提供);
SoapSender和SoapReceiver:
客户端和服务器同时实现;
客户端使用SoapSender发送消息(可选择使用SoapReceiver接收消息);
服务器使用SoapReceiver接收消息(可选择使用SoapSender发送通知和回应);
(7)、使用MSMQ:
MSMQ用于消息传输:
适用于Web Services;
具有可靠的异步行为(要求能够在服务中提供可靠的队列,允许多监听者使用单一队列);
支持事务(同时支持本地事务和企业服务,SWC安装在Windows Server 2003和Windows XP SP2中);