自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Silverlight 5 項目使用async/await

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

.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.    // 假設(shè)這是用戶輸入的坐標(biāo)   
  3.    var point1 = GeometryUtil.CreateMapPointWgs84(113.3, 23.07);   
  4.    // 假設(shè)用戶輸入目的地坐標(biāo)   
  5.    var point2 = GeometryUtil.CreateMapPointWgs84(110.3, 20);   
  6.    // 全局地圖控件   
  7.    var map = App.ObjContainer.Resolve(typeof(Map));   
  8.    // 從當(dāng)前 UI 上下文創(chuàng)建 TaskScheduler   
  9.    var uiContext = TaskScheduler.FromCurrentSynchronizationContext();   
  10.    // 創(chuàng)建三個幾何服務(wù)   
  11.    var geoSvc1 = GeoFactory.CreateGeometryService();   
  12.    var geoSvc2 = GeoFactory.CreateGeometryService();   
  13.    var geoSvc3 = GeoFactory.CreateGeometryService();   
  14.    // 將用戶輸入的坐標(biāo)投影為地圖的坐標(biāo)系坐標(biāo)   
  15.    var task1 = geoSvc1.ProjectPointAsync(point1, map.SpatialReference);   
  16.    task1.ContinueWith(t1 => {   
  17.       point1 = task1.Result;   
  18.       // 目的地坐標(biāo)投影為地圖坐標(biāo)   
  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:星際競技場
責(zé)任編輯:張偉 來源: 張志敏的博客
相關(guān)推薦

2022-06-16 10:37:09

asyncawait

2014-07-15 10:31:07

asyncawait

2016-11-22 11:08:34

asyncjavascript

2020-03-11 09:15:25

微信asyncawait

2021-07-20 10:26:12

JavaScriptasyncawait

2023-10-08 10:21:11

JavaScriptAsync

2022-08-27 13:49:36

ES7promiseresolve

2023-07-28 07:31:52

JavaScriptasyncawait

2024-12-30 08:22:35

2021-06-28 07:27:43

AwaitAsync語法

2024-12-23 08:00:45

2023-04-14 08:10:59

asyncawait

2022-06-13 07:36:47

useEffectHooks

2021-06-15 05:36:45

Gulpawaitasync

2017-04-10 15:57:10

AsyncAwaitPromise

2022-11-21 09:01:00

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

2017-08-02 14:17:08

前端asyncawait

2014-07-15 10:08:42

異步編程In .NET

2021-08-18 07:05:57

ES6Asyncawait

2021-06-28 08:10:59

JavaScript異步編程
點贊
收藏

51CTO技術(shù)棧公眾號