这是一个常见的问题,由于Silverlight只支持异步调用后台的服务,而如果有多个任务的话,可能就很麻烦,往往就是要在一个异步任务结束事件中去调用另外一个任务,以此类推。典型的问题就是,代码很复杂,而且几乎很难维护。看看下面的代码吧
创新互联建站专注为客户提供全方位的互联网综合服务,包含不限于网站设计、成都网站设计、斗门网络推广、成都小程序开发、斗门网络营销、斗门企业策划、斗门品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联建站为所有大学生创业者提供斗门建站搭建服务,24小时服务热线:18982081108,官方网址:www.cdcxhl.com
- //传统的多个异步任务的调用方法,必须是一层一层嵌套的方式
- var proxy = newServiceReference1.WebService1SoapClient();
- proxy.Endpoint.Address = newSystem.ServiceModel.EndpointAddress(
- newUri(App.Current.Host.Source, "../WebService1.asmx"));
- proxy.HelloWorldCompleted += (o, a) =>
- {
- proxy.GetEmployeeCompleted += (o1, a1) =>
- {
- proxy.GetCustomersCompleted += (o2, a1) =>
- {
- };
- proxy.GetCustomersAsync();
- };
- proxy.GetEmployeeAsync();
- };
- proxy.HelloWorldAsync();
为了解决这个问题,我自己也想过一些办法,同时参考了张志敏的如下文章
http://www.cnblogs.com/beginor/archive/2010/12/24/1915910.html
这篇文章提供了一个不错的思路。这篇文章的评论中,有朋友也提到了Reactive Framework,我看了看,还没有找到很好的应用方法。这个Framework是一个很强大的东西,但在本文讨论的场景中具体该如何应用,如果有这方面研究的朋友,请不吝赐教
在这篇文章提供的简单模型基础上,我做了一些修改,并且也增加了一些更加实用的特性。共享出来给大家参考
添加和改进的功能主要是:
1.使用更加便捷(原先是用IEnumerator去构造Runner,现在提供了更多的支持,可以是一个Array,也可以是一个List等等,因为我们很多时候任务是动态构造出来的)
2.提供了任务结果反馈(ActionResult)的功能
3.提供了任务之间约束的功能,在每个任务里面都可以得到前置任务的信息
如何使用?
第一步:添加Nuget Package,关于什么是Nuget,请参考 http://www.cnblogs.com/dudu/archive/2011/07/15/nuget.html
第二步,参考如下的范例代码
运行效果
可以直接复制这个代码进行使用或者修改
- usingSystem;
- usingSystem.Collections.Generic;
- /*
- * 这个设计针对在Silverlight中经常需要对多个远程服务进行调用,而且我们可能需要让这些任务之间有固定的顺序,同时还希望能够在任务之间传递任务状态。
- * 作者:陈希章
- * 时间:2011年8月30日
- * 反馈:ares@xizhang.com
- */
- #regionSample Code
- ////第一个任务
- //var task = new AsyncAction();
- //task.SetAction(() =>
- //{
- // var proxy = new ServiceReference1.WebService1SoapClient();
- // proxy.Endpoint.Address = new System.ServiceModel.EndpointAddress(
- // new Uri(App.Current.Host.Source, "../WebService1.asmx"));
- // proxy.HelloWorldCompleted += (o, a) =>
- // {
- // task.ActionResult.TaskName = "Hello,world";
- // task.ActionResult.Message = "Test test";
- // task.ActionResult.Result = a.Result;
- // task.ActionResult.Status = ActionStatus.Success;
- // task.OnCompleted();
- // };
- // proxy.HelloWorldAsync();
- //}, true);
- ////第二个任务
- //var task2 = new AsyncAction();
- //task2.SetAction(() =>
- //{
- // var proxy = new ServiceReference1.WebService1SoapClient();
- // proxy.Endpoint.Address = new System.ServiceModel.EndpointAddress(
- // new Uri(App.Current.Host.Source, "../WebService1.asmx"));
- // proxy.HelloWorldCompleted += (o, a) =>
- // {
- // task2.ActionResult.TaskName = "Hello,world";
- // task2.ActionResult.Message = "Test test";
- // task2.ActionResult.Result = a.Result;
- // task2.ActionResult.Status = ActionStatus.Success;
- // task2.OnCompleted();
- // };
- // proxy.HelloWorldAsync();
- //}, true);
- ////构造Runner
- //var runner = new AsyncActionRunner(new[] { task, task2 });
- ////注册完成事件
- //runner.Completed += (o, a) =>
- //{
- // //将界面设置为空闲
- // busyIndicator.IsBusy = false;
- // //显示所有任务的执行结果
- // dgResult.ItemsSource = runner.TaskResults;
- //};
- ////将界面设置为忙碌
- //busyIndicator.IsBusy = true;
- ////执行
- //runner.Execute();
- #endregion
- namespaceSystem
- {
- ///
- /// 这个枚举记录了任务的状态,默认为Ready
- ///
- publicenumActionStatus
- {
- Ready,//准备好,如果最后检查仍然为这个状态,则通常表示该任务被跳过了
- Success,//成功
- Failure,//失败
- Completed//完成
- }
- ///
- /// 这个记录了任务的结果
- ///
- publicclassActionResult
- {
- publicActionResult()
- {
- Status = ActionStatus.Ready;//默认为ready
- StartTime = DateTime.Now;
- }
- ///
- /// 任务名称
- ///
- publicstringTaskName { get; set; }
- ///
- /// 状态
- ///
- publicActionStatus Status { get; set; }
- ///
- /// 消息
- ///
- publicstringMessage { get; set; }
- ///
- /// 任务结果
- ///
- publicobjectResult { get; set; }
- ///
- /// 开始时间
- ///
- publicDateTime StartTime { get; set; }
- ///
- /// 结束时间
- ///
- publicDateTime EndTime { get; set; }
- }
- ///
- /// 异步任务的接口
- ///
- publicinterfaceIAsyncAction
- {
- voidExecute();
- eventEventHandler Completed;
- ActionResult PreActionResult { get; set; }
- ActionResult ActionResult { get; set; }
- }
- ///
- /// 异步任务的实现类型
- ///
- publicclassAsyncAction : IAsyncAction
- {
- publicAsyncAction()
- {
- ActionResult = newActionResult();
- }
- privateboolAutoComplete = false;
- privateAction Action { get; set; }
- ///
- /// 设置要执行的操作
- ///
- /// 操作
- /// 是否自动完成
- publicvoidSetAction(Action action, boolautoComplete)
- {
- Action = action;
- AutoComplete = autoComplete;
- }
- publicvirtualvoidExecute()
- {
- if(Action != null)
- {
- ActionResult.StartTime = DateTime.Now;
- Action();
- if(!AutoComplete)
- OnCompleted();
- }
- }
- publiceventEventHandler Completed;
- publicvoidOnCompleted()
- {
- var completed = this.Completed;
- if(completed != null)
- {
- completed(this, EventArgs.Empty);
- }
- }
- ///
- /// 前置任务的结果,添加这个功能目的是,可能多个任务之间互相有所依赖,例如某个任务要根据前面任务的情况决定是否执行
- ///
- publicActionResult PreActionResult { get; set; }
- ///
- /// 当前任务的结果
- ///
- publicActionResult ActionResult { get; set; }
- }
- ///
- /// 任务运行器
- ///
- publicclassAsyncActionRunner
- {
- publicAsyncActionRunner()
- {
- TaskResults = newList
(); - }
- privatereadonlyIEnumerator
_enumerator; - publicAsyncActionRunner(IEnumerator
enumerator) - : this()
- {
- this._enumerator = enumerator;
- }
- publicAsyncActionRunner(IEnumerable
tasks) - : this()
- {
- _enumerator = tasks.GetEnumerator();
- }
- ///
- /// 完成事件及处理方法
- ///
- publiceventEventHandler Completed;
- ///
- /// 保存所有任务的执行结果
- ///
- publicList
TaskResults { get; privateset; } - ///
- /// 临时保存的当前任务的执行结果
- ///
- privateActionResult tmp = null;
- ///
- /// 执行所有任务
- ///
- publicvoidExecute()
- {
- if(this._enumerator.MoveNext())
- {
- this._enumerator.Current.Completed += (sender, args) =>
- {
- tmp = ((IAsyncAction)sender).ActionResult;
- tmp.EndTime = DateTime.Now;
- TaskResults.Add(tmp);
- this.Execute();
- };
- this._enumerator.Current.PreActionResult = tmp;
- this._enumerator.Current.Execute();
- }
- else
- {
- var completed = this.Completed;
- if(completed != null)
- {
- completed(this, EventArgs.Empty);
- }
- }
- }
- }
- }
当前名称:Silverlight中对多个异步任务的调用
本文链接:http://www.mswzjz.cn/qtweb/news45/277395.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能