博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在 Silverlight 5 项目中使用 async/await
阅读量:6030 次
发布时间:2019-06-20

本文共 3465 字,大约阅读时间需要 11 分钟。

.Net 4.5 提供了 async/await 让异步编程回归同步, 不过, async/await 不是只能在 .Net 4.5 下才能使用, 通过使用 Async Targeting Pack 就可以在 .Net 4.0 以及 Silverlight 5 项目中使用 async/await。

先来看一段 Silverlight 代码, 不使用 async/await 时是这样子的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
private 
void 
DistanceTestButtonClick(
object 
sender, RoutedEventArgs routedEventArgs) {
   
// 假设这是用户输入的坐标
   
var 
point1 = GeometryUtil.CreateMapPointWgs84(113.3, 23.07);
   
// 假设用户输入目的地坐标
   
var 
point2 = GeometryUtil.CreateMapPointWgs84(110.3, 20);
   
// 全局地图控件
   
var 
map = App.ObjContainer.Resolve(
typeof
(Map));
   
// 从当前 UI 上下文创建 TaskScheduler
   
var 
uiContext = TaskScheduler.FromCurrentSynchronizationContext();
   
// 创建三个几何服务
   
var 
geoSvc1 = GeoFactory.CreateGeometryService();
   
var 
geoSvc2 = GeoFactory.CreateGeometryService();
   
var 
geoSvc3 = GeoFactory.CreateGeometryService();
   
// 将用户输入的坐标投影为地图的坐标系坐标
   
var 
task1 = geoSvc1.ProjectPointAsync(point1, map.SpatialReference);
   
task1.ContinueWith(t1 => {
      
point1 = task1.Result;
      
// 目的地坐标投影为地图坐标
      
var 
task2 = geoSvc2.ProjectPointAsync(point2, map.SpatialReference);
      
task2.ContinueWith(t2 => {
         
point2 = task2.Result;
         
var 
buffParam =
this
.CreateBufferParameters(point2);
         
var 
buffTask = geoSvc3.BufferTaskAsync(buffParam);
         
// 做一次缓冲查询
         
buffTask.ContinueWith(t3 => {
            
var 
buffGeometry = buffTask.Result.First();
            
var 
disParam =
new 
DistanceParameters {
               
DistanceUnit = LinearUnit.Meter,
               
Geodesic =
true
            
};
            
// 求距离
            
var 
disTask1 = geoSvc1.DistanceTaskAsync(point1, point2, disParam);
            
disTask1.ContinueWith(t4 => {
               
var 
disTask2 = geoSvc2.DistanceTaskAsync(point1, buffGeometry.Geometry, disParam);
               
disTask2.ContinueWith(t5 => {
                  
//最后求得最终距离
                  
var 
dis1 = disTask1.Result;
                  
var 
dis2 = disTask2.Result;
               
}, uiContext);
            
}, uiContext);
         
}, uiContext);
      
}, uiContext);
   
}, uiContext);
}

看上面的代码, 做 Silverlight 开发的可真伤不起啊, Silverlight 阉割了所有的同步方法, 只能做异步查询, 本来是可以放在后台线程中模拟同步的,可偏偏 ArcGIS 提供的 Silverlight API 在回调函数中创建了 UI 元素以及 DepedencyObject , 想放到后台线程中计算也不行, 真是悲剧。

下面就请出 Async Targeting Pack 来拯救一下吧, 打开 NuGet 管理器, 输入 await 查询, 找到 Async Targeting Pack for Visual Studio 11 , 然后下载并添加引用到 Silverlight 项目, 开始用 async/await 改造上面的代码, 最终的结果如下, 看看是不是清爽了好多呢?

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

这样编译出来的 xap 包只是多了一个 dll, 依然可以在 Silverlight5 下运行, 客户端不需要安装任何软件。

大家赶快升级 VS2012 吧, 异步编程回归同步了!

所有文章遵循,要求署名、非商业 、保持一致。在满足的基础上可以转载,但请以超链接形式注明出处。

本博客已经迁移到 GitHub , 围观地址: 

本文转自张志敏博客园博客,原文链接:http://www.cnblogs.com/beginor/archive/2012/07/21/2602838.html
,如需转载请自行联系原作者
你可能感兴趣的文章
步步为营 .NET 设计模式学习笔记系列总结
查看>>
SurfaceView-----------------转
查看>>
I.MX6 View长宽大于屏的分辨率
查看>>
从源码带你看懂functools的partial方法
查看>>
nginx 多进程 + io多路复用 实现高并发
查看>>
vue兄弟组件通信
查看>>
[原]java开发中遇到的问题及解决方法(持续更新)
查看>>
PHPExcel 去掉错误提示 保护表格
查看>>
Codeforces 864 A Fair Game 水题
查看>>
返回顶部[初音未来]源码
查看>>
12.5寸新i5商务本 联想X220i报10888元
查看>>
几款Java手机看书软件(一)
查看>>
wifi定位
查看>>
曹公论英雄
查看>>
UIImageView
查看>>
7天免登陆
查看>>
C语言中两种方式表示时间日期值time_t和struct tm类型的相互转换
查看>>
2018.10.30-dtoj-4008-纸牌游戏(cards)
查看>>
2017-2018-1 20155222 《信息安全系统设计基础》第8周学习总结
查看>>
C#中DataTable的一些用法
查看>>