日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Silverlight中對(duì)多個(gè)異步任務(wù)的調(diào)用

這是一個(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

 
 
 
 
  1.   //傳統(tǒng)的多個(gè)異步任務(wù)的調(diào)用方法,必須是一層一層嵌套的方式
  2.   var proxy = newServiceReference1.WebService1SoapClient();
  3.   proxy.Endpoint.Address = newSystem.ServiceModel.EndpointAddress(
  4.   newUri(App.Current.Host.Source, "../WebService1.asmx"));
  5.   proxy.HelloWorldCompleted += (o, a) =>
  6.   {
  7.   proxy.GetEmployeeCompleted += (o1, a1) =>
  8.   {
  9.   proxy.GetCustomersCompleted += (o2, a1) =>
  10.   {
  11.   };
  12.   proxy.GetCustomersAsync();
  13.   };
  14.   proxy.GetEmployeeAsync();
  15.   };
  16.   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)行使用或者修改

 
 
 
 
  1.   usingSystem;
  2.   usingSystem.Collections.Generic;
  3.   /*
  4.   * 這個(gè)設(shè)計(jì)針對(duì)在Silverlight中經(jīng)常需要對(duì)多個(gè)遠(yuǎn)程服務(wù)進(jìn)行調(diào)用,而且我們可能需要讓這些任務(wù)之間有固定的順序,同時(shí)還希望能夠在任務(wù)之間傳遞任務(wù)狀態(tài)。
  5.   * 作者:陳希章
  6.   * 時(shí)間:2011年8月30日
  7.   * 反饋:ares@xizhang.com
  8.   */
  9.   #regionSample Code
  10.   ////第一個(gè)任務(wù)
  11.   //var task = new AsyncAction();
  12.   //task.SetAction(() =>
  13.   //{
  14.   // var proxy = new ServiceReference1.WebService1SoapClient();
  15.   // proxy.Endpoint.Address = new System.ServiceModel.EndpointAddress(
  16.   // new Uri(App.Current.Host.Source, "../WebService1.asmx"));
  17.   // proxy.HelloWorldCompleted += (o, a) =>
  18.   // {
  19.   // task.ActionResult.TaskName = "Hello,world";
  20.   // task.ActionResult.Message = "Test test";
  21.   // task.ActionResult.Result = a.Result;
  22.   // task.ActionResult.Status = ActionStatus.Success;
  23.   // task.OnCompleted();
  24.   // };
  25.   // proxy.HelloWorldAsync();
  26.   //}, true);
  27.   ////第二個(gè)任務(wù)
  28.   //var task2 = new AsyncAction();
  29.   //task2.SetAction(() =>
  30.   //{
  31.   // var proxy = new ServiceReference1.WebService1SoapClient();
  32.   // proxy.Endpoint.Address = new System.ServiceModel.EndpointAddress(
  33.   // new Uri(App.Current.Host.Source, "../WebService1.asmx"));
  34.   // proxy.HelloWorldCompleted += (o, a) =>
  35.   // {
  36.   // task2.ActionResult.TaskName = "Hello,world";
  37.   // task2.ActionResult.Message = "Test test";
  38.   // task2.ActionResult.Result = a.Result;
  39.   // task2.ActionResult.Status = ActionStatus.Success;
  40.   // task2.OnCompleted();
  41.   // };
  42.   // proxy.HelloWorldAsync();
  43.   //}, true);
  44.   ////構(gòu)造Runner
  45.   //var runner = new AsyncActionRunner(new[] { task, task2 });
  46.   ////注冊(cè)完成事件
  47.   //runner.Completed += (o, a) =>
  48.   //{
  49.   // //將界面設(shè)置為空閑
  50.   // busyIndicator.IsBusy = false;
  51.   // //顯示所有任務(wù)的執(zhí)行結(jié)果
  52.   // dgResult.ItemsSource = runner.TaskResults;
  53.   //};
  54.   ////將界面設(shè)置為忙碌
  55.   //busyIndicator.IsBusy = true;
  56.   ////執(zhí)行
  57.   //runner.Execute();
  58.   #endregion
  59.   namespaceSystem
  60.   {
  61.   /// 
  62.   /// 這個(gè)枚舉記錄了任務(wù)的狀態(tài),默認(rèn)為Ready
  63.   /// 
  64.  publicenumActionStatus
  65.  {
  66.   Ready,//準(zhǔn)備好,如果最后檢查仍然為這個(gè)狀態(tài),則通常表示該任務(wù)被跳過(guò)了
  67.   Success,//成功
  68.   Failure,//失敗
  69.   Completed//完成
  70.   }
  71.   /// 
  72.   /// 這個(gè)記錄了任務(wù)的結(jié)果
  73.   /// 
  74.   publicclassActionResult
  75. {
  76.  publicActionResult()
  77.   {
  78.   Status = ActionStatus.Ready;//默認(rèn)為ready
  79.   StartTime = DateTime.Now;
  80.  }
  81. /// 
  82.   /// 任務(wù)名稱
  83.   /// 
  84.   publicstringTaskName { get; set; }
  85.   /// 
  86.   /// 狀態(tài)
  87.   /// 
  88.  publicActionStatus Status { get; set; }
  89.   /// 
  90.   /// 消息
  91.   /// 
  92.   publicstringMessage { get; set; }
  93.   /// 
  94.   /// 任務(wù)結(jié)果
  95.   /// 
  96.   publicobjectResult { get; set; }
  97.   /// 
  98.   /// 開始時(shí)間
  99.   /// 
  100.   publicDateTime StartTime { get; set; }
  101.   /// 
  102.   /// 結(jié)束時(shí)間
  103.   /// 
  104.   publicDateTime EndTime { get; set; }
  105.   }
  106.   /// 
  107.   /// 異步任務(wù)的接口
  108.   /// 
  109.  publicinterfaceIAsyncAction
  110.   {
  111.   voidExecute();
  112.   eventEventHandler Completed;
  113.   ActionResult PreActionResult { get; set; }
  114.   ActionResult ActionResult { get; set; }
  115.   }
  116.   /// 
  117.  /// 異步任務(wù)的實(shí)現(xiàn)類型
  118.   /// 
  119.   publicclassAsyncAction : IAsyncAction
  120.   {
  121.   publicAsyncAction()
  122.  {
  123.   ActionResult = newActionResult();
  124.   }
  125.   privateboolAutoComplete = false;
  126.   privateAction Action { get; set; }
  127.   /// 
  128.  /// 設(shè)置要執(zhí)行的操作
  129.   /// 
  130.   /// 操作
  131.   /// 是否自動(dòng)完成
  132.   publicvoidSetAction(Action action, boolautoComplete)
  133.   {
  134.  Action = action;
  135.   AutoComplete = autoComplete;
  136.   }
  137.   publicvirtualvoidExecute()
  138.   {
  139.   if(Action != null)
  140.   {
  141.   ActionResult.StartTime = DateTime.Now;
  142.   Action();
  143.   if(!AutoComplete)
  144.   OnCompleted();
  145.   }
  146.   }
  147.   publiceventEventHandler Completed;
  148.   publicvoidOnCompleted()
  149.   {
  150.   var completed = this.Completed;
  151.   if(completed != null)
  152.  {
  153.  completed(this, EventArgs.Empty);
  154.   }
  155.   }
  156.   /// 
  157.   /// 前置任務(wù)的結(jié)果,添加這個(gè)功能目的是,可能多個(gè)任務(wù)之間互相有所依賴,例如某個(gè)任務(wù)要根據(jù)前面任務(wù)的情況決定是否執(zhí)行
  158.   /// 
  159.   publicActionResult PreActionResult { get; set; }
  160.   /// 
  161.   /// 當(dāng)前任務(wù)的結(jié)果
  162.  /// 
  163.   publicActionResult ActionResult { get; set; }
  164.   }
  165.   /// 
  166.   /// 任務(wù)運(yùn)行器
  167.   /// 
  168.   publicclassAsyncActionRunner
  169.   {
  170.   publicAsyncActionRunner()
  171.   {
  172.   TaskResults = newList();
  173.   }
  174.   privatereadonlyIEnumerator _enumerator;
  175.   publicAsyncActionRunner(IEnumerator enumerator)
  176.   : this()
  177.   {
  178.   this._enumerator = enumerator;
  179.   }
  180.   publicAsyncActionRunner(IEnumerable tasks)
  181.   : this()
  182.   {
  183.   _enumerator = tasks.GetEnumerator();
  184.   }
  185.   /// 
  186.   /// 完成事件及處理方法
  187.   /// 
  188.   publiceventEventHandler Completed;
  189.   /// 
  190.   /// 保存所有任務(wù)的執(zhí)行結(jié)果
  191.   /// 
  192.   publicList TaskResults { get; privateset; }
  193.   /// 
  194.   /// 臨時(shí)保存的當(dāng)前任務(wù)的執(zhí)行結(jié)果
  195.   /// 
  196.   privateActionResult tmp = null;
  197.   /// 
  198.   /// 執(zhí)行所有任務(wù)
  199.   /// 
  200.   publicvoidExecute()
  201.   {
  202.   if(this._enumerator.MoveNext())
  203.   {
  204.   this._enumerator.Current.Completed += (sender, args) =>
  205.   {
  206.   tmp = ((IAsyncAction)sender).ActionResult;
  207.   tmp.EndTime = DateTime.Now;
  208.   TaskResults.Add(tmp);
  209.   this.Execute();
  210.   };
  211.   this._enumerator.Current.PreActionResult = tmp;
  212.   this._enumerator.Current.Execute();
  213.   }
  214.   else
  215.   {
  216.   var completed = this.Completed;
  217.  if(completed != null)
  218.   {
  219.   completed(this, EventArgs.Empty);
  220.   }
  221.   }
  222.   }
  223.   }
  224.   }

分享名稱:Silverlight中對(duì)多個(gè)異步任務(wù)的調(diào)用
當(dāng)前URL:http://www.dlmjj.cn/article/dhgsigg.html