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

2021-06-28 07:27:43

AwaitAsync语法

2023-07-28 07:31:52

JavaScriptasyncawait

2023-04-14 08:10:59

asyncawait

2021-06-15 05:36:45

Gulpawaitasync

2022-06-13 07:36:47

useEffectHooks

2017-04-10 15:57:10

AsyncAwaitPromise

2017-08-02 14:17:08

前端asyncawait

2014-07-15 10:08:42

异步编程In .NET

2022-11-21 09:01:00

Swift并发结构

2021-08-18 07:05:57

ES6Asyncawait

2024-03-12 08:37:32

asyncawaitJavaScript

2021-06-28 08:10:59

JavaScript异步编程

2024-02-01 09:39:02

asyncawaitPromise
点赞
收藏

51CTO技术栈公众号