异步调用,离线处理,队列管理的关系
(系列从"十"后的例子我已经重新上传进行了整理,都是自己在学习的过程中做的一些例子,比较粗糙,因为原来都是一边看一边做的练习用的例子,虽然写的不好,希望能给各位朋友一些帮助吧,以后有时间会做的更好一点)
为什么把这三者都放在一起呢?因为这三者其实是以Command对象为主轴相互关联的技术问题。这里先看看图4.2.1:
图 4.2.1
整个流程是当客户向AsynchTimeOutProxy异步代理对象发出操作请求,AsynchTimeOutProxy会把请求封装为一个Command对象后加进CommandQueue队列对象中,并通过委托事件处理该Command对象,无论成功与否返回一个callback的委托信息让客户端根据返回信息进行操作成功处理还是操作失败(离线)处理。
这里看一个实例,以便能对他们三者的关系有更具体的了解。在项目AppraiserWorkbench中,Client部分对应视图为:
图 4.2.2
其中的Presenter部分相关代码为:
AvailableAppraisalsViewPresenter.cs
/// <summary> /// Shows the available appraisals. /// </summary> public void ShowAvailableAppraisals() { OnStatusUpdate(String.Empty);
_appraisalService.GetAppraisals(AppraisalFilter.Unassigned, delegate(bool success, Appraisal[] appraisals) { if (success) { View.SetAppraisals(appraisals); } else { OnStatusUpdate(Properties.Resources.CannotGetListUnAppraisals); _messageBoxSvc.Show(Properties.Resources.CannotGetListUnAppraisals); View.CloseView(); } }); } |
其中的红色部分为调用代理的代码。这里的AsynchTimeOutProxy对象部分的功能在该实例中主要由AppraisalManagementServiceAgent和AppraisalManagementServiceProxy两个类协同处理AppraisalManagementServiceAgent负责调用相关的Command对象并发送给AppraisalManagementServiceProxy来进行处理:
public void GetAppraisals(AppraisalFilter filter, GetAppraisalsCallback callback) { Guard.ArgumentNotNull(callback, "callback");
if (filter == AppraisalFilter.MyAppraisals) { callback(true, GetLocalAppraisals()); return; }
_appraisalServiceProxy.GetAppraisals ( GET_APPRAISALS_TIMEOUT, UserId, ClientFilterToSvcFilter(filter), delegate(bool success, GlobalBank.AppraiserWorkbench.WebServiceProxies.AppraisalService.Appraisal[] appraisals) { OnGetAppraisalsComplete(success, appraisals, filter, callback); } ); }
private void OnGetAppraisalsComplete(bool success, GlobalBank.AppraiserWorkbench.WebServiceProxies.AppraisalService.Appraisal[] appraisals, AppraisalFilter filter, GetAppraisalsCallback callback) { Appraisal[] result = null;
if (success) { List<Appraisal> appraisalsResult = new List<Appraisal>();
foreach (GlobalBank.AppraiserWorkbench.WebServiceProxies.AppraisalService.Appraisal wsAppraisal in appraisals) { if (Contains(wsAppraisal.Id)) appraisalsResult.Add(Load(wsAppraisal.Id)); else { Appraisal appraisal = SvcAppraisalToClientAppraisal(wsAppraisal); appraisalsResult.Add(appraisal);
if (filter == AppraisalFilter.MyAppraisals) Save(appraisal); } }
result = appraisalsResult.ToArray(); }
OnServiceOperationNotification(success); callback(success, result); } |
而AppraisalManagementServiceProxy负责把Command对象放到队列中并实现Command的对象请求。
public void GetAppraisals(int timeout, string userId, AppraisalFilter filter, Commands.GetAppraisalsCommand.CallbackType callback) { Queue.Add(new WebServiceProxies.AppraisalService.Commands.GetAppraisalsCommand(Service, timeout, userId, filter, callback)); } |
红色部分就是CommandQueue对象实例。
后记:其实这篇文章例子说的不好,一直放在草稿箱中.想等以后修改.不想一放就放了快两年了,现在也不修改了,直接发出来了,有问题的地方大家就见谅了,至于新的例子倒很多,只是后来想整理.一忙起来就忘了.等以后找到再放上来吧.其实它本身提供的例子已经很好了.