成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Silverlight 5 項目使用async/await

開發(fā) 后端
看上面的代碼,做Silverlight 開發(fā)的可真?zhèn)黄鸢。琒ilverlight 閹割了所有的同步方法,只能做異步查詢,本來是可以放在后臺線程中模擬同步的......

.Net 4.5 提供了 async/await 讓異步編程回歸同步, 不過,async/await 不是只能在 .Net 4.5 下才能使用, 通過使用 Async Targeting Pack 就可以在 .Net 4.0 以及 Silverlight 5 項目中使用 async/await。

先來看一段 Silverlight 代碼, 不使用 async/await 時是這樣子的:

  1. private void DistanceTestButtonClick(object sender, RoutedEventArgs routedEventArgs) {   
  2.    // 假設這是用戶輸入的坐標   
  3.    var point1 = GeometryUtil.CreateMapPointWgs84(113.3, 23.07);   
  4.    // 假設用戶輸入目的地坐標   
  5.    var point2 = GeometryUtil.CreateMapPointWgs84(110.3, 20);   
  6.    // 全局地圖控件   
  7.    var map = App.ObjContainer.Resolve(typeof(Map));   
  8.    // 從當前 UI 上下文創(chuàng)建 TaskScheduler   
  9.    var uiContext = TaskScheduler.FromCurrentSynchronizationContext();   
  10.    // 創(chuàng)建三個幾何服務   
  11.    var geoSvc1 = GeoFactory.CreateGeometryService();   
  12.    var geoSvc2 = GeoFactory.CreateGeometryService();   
  13.    var geoSvc3 = GeoFactory.CreateGeometryService();   
  14.    // 將用戶輸入的坐標投影為地圖的坐標系坐標   
  15.    var task1 = geoSvc1.ProjectPointAsync(point1, map.SpatialReference);   
  16.    task1.ContinueWith(t1 => {   
  17.       point1 = task1.Result;   
  18.       // 目的地坐標投影為地圖坐標   
  19.       var task2 = geoSvc2.ProjectPointAsync(point2, map.SpatialReference);   
  20.       task2.ContinueWith(t2 => {   
  21.          point2 = task2.Result;   
  22.          var buffParam = this.CreateBufferParameters(point2);   
  23.          var buffTask = geoSvc3.BufferTaskAsync(buffParam);   
  24.          // 做一次緩沖查詢   
  25.          buffTask.ContinueWith(t3 => {   
  26.             var buffGeometry = buffTask.Result.First();   
  27.             var disParam = new DistanceParameters {   
  28.                DistanceUnit = LinearUnit.Meter,   
  29.                Geodesic = true 
  30.             };   
  31.             // 求距離   
  32.             var disTask1 = geoSvc1.DistanceTaskAsync(point1, point2, disParam);   
  33.             disTask1.ContinueWith(t4 => {   
  34.                var disTask2 = geoSvc2.DistanceTaskAsync(point1, buffGeometry.Geometry, disParam);   
  35.                disTask2.ContinueWith(t5 => {   
  36.                   //***求得最終距離   
  37.                   var dis1 = disTask1.Result;   
  38.                   var dis2 = disTask2.Result;   
  39.                }, uiContext);   
  40.             }, uiContext);   
  41.          }, uiContext);   
  42.       }, uiContext);   
  43.    }, uiContext);   

看上面的代碼,做Silverlight 開發(fā)的可真?zhèn)黄鸢?,Silverlight 閹割了所有的同步方法,只能做異步查詢,本來是可以放在后臺線程中模擬同步的,可偏偏 ArcGIS 提供的 Silverlight API 在回調(diào)函數(shù)中創(chuàng)建了 UI 元素以及 DepedencyObject ,想放到后臺線程中計算也不行,真是悲劇。

下面就請出 Async Targeting Pack 來拯救一下吧, 打開 NuGet 管理器, 輸入 await 查詢, 找到 Async Targeting Pack for Visual Studio 11 , 然后下載并添加引用到 Silverlight 項目, 開始用 async/await 改造上面的代碼, 最終的結(jié)果如下, 看看是不是清爽了好多呢?

  1. async private void DistanceTestButtonClick(object sender, RoutedEventArgs routedEventArgs) {   
  2.     var point1 = GeometryUtil.CreateMapPointWgs84(113.3, 23.07);   
  3.     var point2 = GeometryUtil.CreateMapPointWgs84(110.3, 20);   
  4.     var map = App.ObjContainer.Resolve(typeof(Map));   
  5.     var geoSvc1 = GeoFactory.CreateGeometryService();   
  6.     var geoSvc2 = GeoFactory.CreateGeometryService();   
  7.     var geoSvc3 = GeoFactory.CreateGeometryService();   
  8.     point1 = await geoSvc1.ProjectGeometryAsync(point1, map.SpatialReference) as MapPoint;   
  9.     point2 = await geoSvc2.ProjectGeometryAsync(point2, map.SpatialReference) as MapPoint;   
  10.     
  11.     var buffParam = this.CreateBufferParameters(point2);   
  12.     var buffGeometry = (await geoSvc3.BufferTaskAsync(buffParam)).First();   
  13.     
  14.     var disParam = new DistanceParameters {   
  15.         DistanceUnit = LinearUnit.Meter,   
  16.         Geodesic = true 
  17.     };   
  18.     var dist1 = await geoSvc1.DistanceTaskAsync(point1, point2, disParam);   
  19.     var dist2 = await geoSvc2.DistanceTaskAsync(point1, buffGeometry.Geometry, disParam);   
  20.     var d = dist2 - dist1;   

這樣編譯出來的 xap 包只是多了一個 dll, 依然可以在 Silverlight5 下運行, 客戶端不需要安裝任何軟件。

大家趕快升級 VS2012 吧, 異步編程回歸同步了!

原文鏈接:http://www.cnblogs.com/beginor/archive/2012/07/21/2602838.html

【編輯推薦】

  1. silverlight仿“百度文庫”的文檔控件
  2. 基于silverlight一個“樹形結(jié)構(gòu)圖”控件
  3. Silverlight開發(fā)頁面需要5分鐘到0分鐘蛻變
  4. 游戲人生Silverlight:貪吃蛇
  5. 游戲人生Silverlight:星際競技場
責任編輯:張偉 來源: 張志敏的博客
相關推薦

2022-06-16 10:37:09

asyncawait

2016-11-22 11:08:34

asyncjavascript

2014-07-15 10:31:07

asyncawait

2020-03-11 09:15:25

微信asyncawait

2023-07-28 07:31:52

JavaScriptasyncawait

2024-12-30 08:22:35

2021-06-28 07:27:43

AwaitAsync語法

2022-08-27 13:49:36

ES7promiseresolve

2023-10-08 10:21:11

JavaScriptAsync

2021-07-20 10:26:12

JavaScriptasyncawait

2024-12-23 08:00:45

2021-06-15 05:36:45

Gulpawaitasync

2022-06-13 07:36:47

useEffectHooks

2023-04-14 08:10:59

asyncawait

2017-04-10 15:57:10

AsyncAwaitPromise

2022-11-21 09:01:00

Swift并發(fā)結(jié)構(gòu)

2014-07-15 10:08:42

異步編程In .NET

2017-08-02 14:17:08

前端asyncawait

2021-08-18 07:05:57

ES6Asyncawait

2024-09-02 14:12:56

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩成人免费 | 国产清纯白嫩初高生在线播放视频 | 国产粉嫩尤物极品99综合精品 | www.久久99| 精品欧美一区二区三区精品久久 | 日韩午夜电影在线观看 | 亚州综合在线 | 欧美一级做性受免费大片免费 | 2018国产大陆天天弄 | 日韩一级二级片 | aaaa一级毛片 | 2019天天操| 国产精品精品久久久 | 国产美女一区二区 | 超碰在线网站 | 一区二区免费 | 欧美成人第一页 | 黄网站免费在线看 | 欧美一级黄视频 | 欧美一区二区在线免费观看 | 麻豆hd| 精品一区二区三区在线视频 | 精品网| 免费看91| 精品亚洲国产成av人片传媒 | 国产福利在线 | 国产精品视频网 | 亚洲国产精品成人久久久 | 三级国产三级在线 | 99亚洲 | 国产精品99久久久久久宅男 | 中文字幕日韩av | 狠狠色狠狠色综合系列 | 午夜视频精品 | 三区在线| 欧美激情亚洲 | 色成人免费网站 | 夜夜骚视频 | 美女在线观看国产 | 99久久婷婷国产综合精品 | 欧美在线精品一区 |