新聞中心
這是一個(gè)常見的問(wèn)題,由于Silverlight只支持異步調(diào)用后臺(tái)的服務(wù),而如果有多個(gè)任務(wù)的話,可能就很麻煩,往往就是要在一個(gè)異步任務(wù)結(jié)束事件中去調(diào)用另外一個(gè)任務(wù),以此類推。典型的問(wèn)題就是,代碼很復(fù)雜,而且?guī)缀鹾茈y維護(hù)??纯聪旅娴拇a吧

創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)、斗門網(wǎng)絡(luò)推廣、成都小程序開發(fā)、斗門網(wǎng)絡(luò)營(yíng)銷、斗門企業(yè)策劃、斗門品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供斗門建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com
- //傳統(tǒng)的多個(gè)異步任務(wù)的調(diào)用方法,必須是一層一層嵌套的方式
- 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();
為了解決這個(gè)問(wèn)題,我自己也想過(guò)一些辦法,同時(shí)參考了張志敏的如下文章
http://www.cnblogs.com/beginor/archive/2010/12/24/1915910.html
這篇文章提供了一個(gè)不錯(cuò)的思路。這篇文章的評(píng)論中,有朋友也提到了Reactive Framework,我看了看,還沒有找到很好的應(yīng)用方法。這個(gè)Framework是一個(gè)很強(qiáng)大的東西,但在本文討論的場(chǎng)景中具體該如何應(yīng)用,如果有這方面研究的朋友,請(qǐng)不吝賜教
在這篇文章提供的簡(jiǎn)單模型基礎(chǔ)上,我做了一些修改,并且也增加了一些更加實(shí)用的特性。共享出來(lái)給大家參考
添加和改進(jìn)的功能主要是:
1.使用更加便捷(原先是用IEnumerator去構(gòu)造Runner,現(xiàn)在提供了更多的支持,可以是一個(gè)Array,也可以是一個(gè)List等等,因?yàn)槲覀兒芏鄷r(shí)候任務(wù)是動(dòng)態(tài)構(gòu)造出來(lái)的)
2.提供了任務(wù)結(jié)果反饋(ActionResult)的功能
3.提供了任務(wù)之間約束的功能,在每個(gè)任務(wù)里面都可以得到前置任務(wù)的信息
如何使用?
第一步:添加Nuget Package,關(guān)于什么是Nuget,請(qǐng)參考 http://www.cnblogs.com/dudu/archive/2011/07/15/nuget.html
第二步,參考如下的范例代碼
運(yùn)行效果
可以直接復(fù)制這個(gè)代碼進(jìn)行使用或者修改
- usingSystem;
- usingSystem.Collections.Generic;
- /*
- * 這個(gè)設(shè)計(jì)針對(duì)在Silverlight中經(jīng)常需要對(duì)多個(gè)遠(yuǎn)程服務(wù)進(jìn)行調(diào)用,而且我們可能需要讓這些任務(wù)之間有固定的順序,同時(shí)還希望能夠在任務(wù)之間傳遞任務(wù)狀態(tài)。
- * 作者:陳希章
- * 時(shí)間:2011年8月30日
- * 反饋:ares@xizhang.com
- */
- #regionSample Code
- ////第一個(gè)任務(wù)
- //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);
- ////第二個(gè)任務(wù)
- //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);
- ////構(gòu)造Runner
- //var runner = new AsyncActionRunner(new[] { task, task2 });
- ////注冊(cè)完成事件
- //runner.Completed += (o, a) =>
- //{
- // //將界面設(shè)置為空閑
- // busyIndicator.IsBusy = false;
- // //顯示所有任務(wù)的執(zhí)行結(jié)果
- // dgResult.ItemsSource = runner.TaskResults;
- //};
- ////將界面設(shè)置為忙碌
- //busyIndicator.IsBusy = true;
- ////執(zhí)行
- //runner.Execute();
- #endregion
- namespaceSystem
- {
- ///
- /// 這個(gè)枚舉記錄了任務(wù)的狀態(tài),默認(rèn)為Ready
- ///
- publicenumActionStatus
- {
- Ready,//準(zhǔn)備好,如果最后檢查仍然為這個(gè)狀態(tài),則通常表示該任務(wù)被跳過(guò)了
- Success,//成功
- Failure,//失敗
- Completed//完成
- }
- ///
- /// 這個(gè)記錄了任務(wù)的結(jié)果
- ///
- publicclassActionResult
- {
- publicActionResult()
- {
- Status = ActionStatus.Ready;//默認(rèn)為ready
- StartTime = DateTime.Now;
- }
- ///
- /// 任務(wù)名稱
- ///
- publicstringTaskName { get; set; }
- ///
- /// 狀態(tài)
- ///
- publicActionStatus Status { get; set; }
- ///
- /// 消息
- ///
- publicstringMessage { get; set; }
- ///
- /// 任務(wù)結(jié)果
- ///
- publicobjectResult { get; set; }
- ///
- /// 開始時(shí)間
- ///
- publicDateTime StartTime { get; set; }
- ///
- /// 結(jié)束時(shí)間
- ///
- publicDateTime EndTime { get; set; }
- }
- ///
- /// 異步任務(wù)的接口
- ///
- publicinterfaceIAsyncAction
- {
- voidExecute();
- eventEventHandler Completed;
- ActionResult PreActionResult { get; set; }
- ActionResult ActionResult { get; set; }
- }
- ///
- /// 異步任務(wù)的實(shí)現(xiàn)類型
- ///
- publicclassAsyncAction : IAsyncAction
- {
- publicAsyncAction()
- {
- ActionResult = newActionResult();
- }
- privateboolAutoComplete = false;
- privateAction Action { get; set; }
- ///
- /// 設(shè)置要執(zhí)行的操作
- ///
- /// 操作
- /// 是否自動(dòng)完成
- 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);
- }
- }
- ///
- /// 前置任務(wù)的結(jié)果,添加這個(gè)功能目的是,可能多個(gè)任務(wù)之間互相有所依賴,例如某個(gè)任務(wù)要根據(jù)前面任務(wù)的情況決定是否執(zhí)行
- ///
- publicActionResult PreActionResult { get; set; }
- ///
- /// 當(dāng)前任務(wù)的結(jié)果
- ///
- publicActionResult ActionResult { get; set; }
- }
- ///
- /// 任務(wù)運(yùn)行器
- ///
- publicclassAsyncActionRunner
- {
- publicAsyncActionRunner()
- {
- TaskResults = newList
(); - }
- privatereadonlyIEnumerator
_enumerator; - publicAsyncActionRunner(IEnumerator
enumerator) - : this()
- {
- this._enumerator = enumerator;
- }
- publicAsyncActionRunner(IEnumerable
tasks) - : this()
- {
- _enumerator = tasks.GetEnumerator();
- }
- ///
- /// 完成事件及處理方法
- ///
- publiceventEventHandler Completed;
- ///
- /// 保存所有任務(wù)的執(zhí)行結(jié)果
- ///
- publicList
TaskResults { get; privateset; } - ///
- /// 臨時(shí)保存的當(dāng)前任務(wù)的執(zhí)行結(jié)果
- ///
- privateActionResult tmp = null;
- ///
- /// 執(zhí)行所有任務(wù)
- ///
- 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中對(duì)多個(gè)異步任務(wù)的調(diào)用
當(dāng)前URL:http://www.dlmjj.cn/article/dhgsigg.html


咨詢
建站咨詢
