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

Silverlight 5 項目使用async/await

開發 后端
看上面的代碼,做Silverlight 開發的可真傷不起啊,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.    // 假設這是用戶輸入的坐標   
  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 上下文創建 TaskScheduler   
  9.    var uiContext = TaskScheduler.FromCurrentSynchronizationContext();   
  10.    // 創建三個幾何服務   
  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 開發的可真傷不起啊,Silverlight 閹割了所有的同步方法,只能做異步查詢,本來是可以放在后臺線程中模擬同步的,可偏偏 ArcGIS 提供的 Silverlight API 在回調函數中創建了 UI 元素以及 DepedencyObject ,想放到后臺線程中計算也不行,真是悲劇。

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

  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一個“樹形結構圖”控件
  3. Silverlight開發頁面需要5分鐘到0分鐘蛻變
  4. 游戲人生Silverlight:貪吃蛇
  5. 游戲人生Silverlight:星際競技場
責任編輯:張偉 來源: 張志敏的博客
相關推薦

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

2022-06-13 07:36:47

useEffectHooks

2021-06-15 05:36:45

Gulpawaitasync

2023-04-14 08:10:59

asyncawait

2017-04-10 15:57:10

AsyncAwaitPromise

2022-11-21 09:01:00

Swift并發結構

2014-07-15 10:08:42

異步編程In .NET

2017-08-02 14:17:08

前端asyncawait

2013-04-16 09:20:57

NetflixHTML5Silverlight

2021-08-18 07:05:57

ES6Asyncawait
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久a久久 | 一区二区三区视频在线观看 | 国产视频二区在线观看 | 亚洲精品自拍视频 | 成人在线观看免费视频 | 国产精品久久久久久久免费大片 | 久久久久久久av | 在线免费观看黄a | 九九精品在线 | 天天爽网站 | 7777在线视频免费播放 | 国产精品一区二 | 久久精品久久精品久久精品 | 欧美黄色大片在线观看 | 99亚洲精品视频 | 亚洲天堂av网 | 久久精品国产一区二区三区 | 国产成人精品午夜 | 国产做a爱免费视频 | 国产乱码一二三区精品 | 一区二区三区免费 | 欧美一级网站 | 黄网站在线观看 | 国产精品美女久久久久久久久久久 | 成人精品视频99在线观看免费 | 亚洲不卡在线观看 | 久久这里有精品 | 夜夜草视频 | 日韩精品一区中文字幕 | 久久久91精品国产一区二区三区 | 中文字幕亚洲精品 | 丝袜美腿一区二区三区动态图 | 亚洲一区二区三区桃乃木香奈 | 日本久久精品视频 | 欧美一级免费黄色片 | 久久精品一级 | 亚洲毛片| 精品欧美色视频网站在线观看 | 久久成人人人人精品欧 | 国产aⅴ| 国产一区二区免费在线 |