智能客户端应用学习系列:SmartClient Software factory中的Composite UI Application Block(Cab)技术了解(十):异步调用,离线处理,队列管理的关系

来源:互联网 发布:淘宝网羽绒服 编辑:程序博客网 时间:2024/05/21 10:03

异步调用,离线处理,队列管理的关系

(系列从"十"后的例子我已经重新上传进行了整理,都是自己在学习的过程中做的一些例子,比较粗糙,因为原来都是一边看一边做的练习用的例子,虽然写的不好,希望能给各位朋友一些帮助吧,以后有时间会做的更好一点)

为什么把这三者都放在一起呢?因为这三者其实是以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对象部分的功能在该实例中主要由AppraisalManagementServiceAgentAppraisalManagementServiceProxy两个类协同处理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对象实例。

后记:其实这篇文章例子说的不好,一直放在草稿箱中.想等以后修改.不想一放就放了快两年了,现在也不修改了,直接发出来了,有问题的地方大家就见谅了,至于新的例子倒很多,只是后来想整理.一忙起来就忘了.等以后找到再放上来吧.其实它本身提供的例子已经很好了.

原创粉丝点击