Windows store app[Part 3]:认识WinRT的异步机制
WinRT异步机制的诞生背景
当编写一个触控应用程序时,执行一个耗时函数,并通知UI更新,我们希望所有的交互过程都可以做出快速的反应。流畅的操作感变的十分重要。
在连接外部程序接口获取数据,操作本地数据等任务时,如果构建方式错误,应用程序会将大量的时间花费等待外部环境上,从而无法保证足够的时间来响应用户的需求。
之前公司的项目需要在Win7系统下编写触控应用程序,不管同事们如何努力的优化着代码,都不能使操作体验达到需求的要求。究其原因,Win7与.NET Framework不是为触控而设计,在进行某些I/O操作时,系统内部降低的UI操作的优先级。
很高兴的是,微软适时的推出了WinRT,配合Win8,操作感为之提升,至少不逊于Ios了。
为解决执行操作等待的环境问题,是微软着手设计WinRT API的核心原则,其提供的API能保证触控程序流畅运行的重要性不言而喻(为了Surface,大家懂得)。
WinRT的内部机制
WinRT对内部许多可能受输入/输出限制的 API 进行了异步化处理。如果执行时间超过50毫秒,那怕是同步编码,也会进行异步化处理。
MS .Net Framework 4.5中增加了Task类,async/await关键字后,通过新机制可以让项目中异步操作变得十分简单。
下面我们就来深入了解下这些新东西。
async/await示例
项目中最简单的一个调用函数,该函数执行获取某个特定文件夹的所有文件,即使在读取阶段,程序任然能够保持十分流畅的UI操作感。
async private void GetFile()
{
var files = await KnownFolders.PicturesLibrary.GetFilesAsync();
this.DataContext = files;
}
“this.DataContext = files;”在GetFilesAsync执行完成后再被执行,通过async/await,异步调用之后的代码将在于原始调用相同的上下文进行回拨。
可以将操作结果通知UI更新,而无需担心返回到UI线程。
那么WinRT是怎么实现异步操作,它的异步基元的原理又是什么?
WinRT异步编程五大核心接口
IAsyncInfo、IAsyncAction、IAsyncActionWithProgress、IAsyncOperation 和IAsyncOperationWithProgress。
WinRT 异步模型的核心接口依托于 IAsyncInfo 而构建。该接口可以定义异步操作(例如,当前状态、取消操作的功能和失败操作的错误等)的属性。
MSDN:戳
从IAsyncInfo的描述中所知,异步操作可以返回结果和在运行时汇报进度,结合后面四种接口可以定义不同的组合。下面引用MSDN上的一张经典图片:

上图用表格形式明了的表述了各个接口的用途。
本文的用例代码实现:
1.IAsyncOperation的三种状态示例:Canceled、Completed 和 Error,异步操作状态Status;
2.实现IAsyncActionWithProgress汇报进度;
3.实现IAsyncOperationWithProgress汇报进度;
代码就不贴了,示例代码讲的比较清楚,如有需要请自行下载:戳
请继续关注Windows store app[Part 4]:深入WinRT的异步机制
Windows store app[Part 3]:认识WinRT的异步机制的更多相关文章
- Windows store app[Part 4]:深入WinRT的异步机制
接上篇Windows store app[Part 3]:认识WinRT的异步机制 WinRT异步机制回顾: IAsyncInfo接口:WinRT下异步功能的核心,该接口提供所有异步操作的基本功能,如 ...
- 在桌面程序上和Metro/Modern/Windows store app的交互(相互打开,配置读取)
这个标题真是取得我都觉得蛋疼..微软改名狂魔搞得我都不知道要叫哪个好.. 这边记录一下自己的桌面程序跟windows store app交互的过程. 由于某些原因,微软的商店应用的安全沙箱导致很多事情 ...
- Windows Store App 过渡动画
Windows Store App 过渡动画 在开发Windows应用商店应用程序时,如果希望界面元素进入或者离开屏幕时显得自然和流畅,可以为其添加过渡动画.过渡动画能够及时地提示用户屏幕所发 ...
- Windows store app[Part 1]:读取U盘数据
Windows 8系统下开发App程序,对于.NET程序员来说,需要重新熟悉下类库. 关于WinRT,引用一张网上传的很多的结构图: 图1 针对App的开发,App工作在系统划定的安全沙箱内,所以通过 ...
- 05、Windows Store app 的图片裁切(更新)
在 Win Phone Silverlight api 中,有一个 PhotoChooserTask 选择器,指定宽.高属性,在选择图片的时候, 可以进行裁切,代码: PhotoChooserTask ...
- 01、Windows Store APP 设置页面横竖屏的方法
在 windows phone store app 中,判断和设置页面横竖屏的方法,与 silverlight 中的 Page 类 不同,不能直接通过 Page.Orientation 进行设置.而是 ...
- Windows store app Settings 的 应用 ( viewmodel + windows.storage)
1.在首页 加入 一个元素(加下滑线的).此元素绑定了两个属性 <!DOCTYPE html> <html> <head> <meta charset=&qu ...
- windows store app 如何计算字符所占的宽度
最近在做一个PDF电子文档相关的项目,我们的app是运行在Windows 8 / WinRT 下的.由于使用的第三方库的一些技术限制,text area竟然不支持多行文本自动换行.于是我们就需要自己实 ...
- Windows Store App JavaScript 开发:获取文件和文件夹列表
在应用程序中有时可能需要获取用户库中的内容,以便执行相关的操作.如果要获取某个用户库中的内容,需要先获取到这个用户库,获得用户库可以通过Windows.Storage命名空间中的KnownFolder ...
随机推荐
- 有关C#中的引用类型的内存问题
对于一个类,如果定义后(记作对象a),将另外一个对象b直接赋值(“a = b”)给它,则相当于将地址赋值给了这个对象.当另外一个对象b不再对这块地址应用时,a由于对这块地址仍在使用,这块地址的指向的栈 ...
- 获取properties配置
1. 使用@Value @Value("${swagger.enable}") 使用Spring的PropertyPlaceholderConfigurer关联 @Val ...
- Handlebars学习第一天
1.什么是handlebars???是用来做什么的??? 首先我们要了解几种前端页面展示的几种模式: a.Struct+vo+el表达式的模式 这种模式的特点:代码看起来比较整齐,但代码解析完才发送到 ...
- elasticsearch 安装 head插件
head插件 切换到Elasticsearch的安装目录 cd ~/demo/elasticsearch/es1 执行安装命令 [root@localhost es1]# bin/plugin ins ...
- My97DatePicker日期控件的使用
本文演示如何在MyEclipse项目中使用My97DatePicker日期控件 1.下载My97DatePicker日期控件, My97DatePicker日期控件下载地址 2.在MyEclipse项 ...
- 关于Redis的常识
原文出自:http://blog.jobbole.com/44476/ 版本:V3.0.2 2013-7-13 (江南白衣版权所有,转载请保留出处) 1. Overview 1.1 资料 <Th ...
- c++ 命令模式(command)
命令模式的有点: 1.能够容易地设计一个命令队列: 2.在需要的情况下,可以比较容易地将命令记入日志. 3.可以容易的实现对请求的撤销和重做. 4.由于加进新的具体命令类不影响其他的类,因此增加新的具 ...
- eclipse插件jd-eclipse的使用
https://blog.csdn.net/u013215289/article/details/51275527
- Opencv3 Robert算子 Sobel算子 拉普拉斯算子 自定义卷积核——实现渐进模糊
#include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; ...
- HowTo: Xen 4.1.3 Windows 8 HVM domU with Intel HD4000 VGA Passthrough on Debian Wheezy
http://linux-bsd-sharing.blogspot.com/2012/10/howto-xen-413-windows-8-hvm-domu-with.html Update 05/0 ...