WinRT异步机制的诞生背景git
当编写一个触控应用程序时,执行一个耗时函数,并通知UI更新,咱们但愿全部的交互过程均可以作出快速的反应。流畅的操做感变的十分重要。github
在链接外部程序接口获取数据,操做本地数据等任务时,若是构建方式错误,应用程序会将大量的时间花费等待外部环境上,从而没法保证足够的时间来响应用户的需求。编程
以前公司的项目须要在Win7系统下编写触控应用程序,无论同事们如何努力的优化着代码,都不能使操做体验达到需求的要求。究其缘由,Win7与.NET Framework不是为触控而设计,在进行某些I/O操做时,系统内部下降的UI操做的优先级。windows
很高兴的是,微软适时的推出了WinRT,配合Win8,操做感为之提高,至少不逊于Ios了。app
为解决执行操做等待的环境问题,是微软着手设计WinRT API的核心原则,其提供的API能保证触控程序流畅运行的重要性不言而喻(为了Surface,你们懂得)。异步
WinRT的内部机制async
WinRT对内部许多可能受输入/输出限制的 API 进行了异步化处理。若是执行时间超过50毫秒,那怕是同步编码,也会进行异步化处理。异步编程
MS .Net Framework 4.5中增长了Task类,async/await关键字后,经过新机制可让项目中异步操做变得十分简单。函数
下面咱们就来深刻了解下这些新东西。优化
async/await示例
项目中最简单的一个调用函数,该函数执行获取某个特定文件夹的全部文件,即便在读取阶段,程序任然可以保持十分流畅的UI操做感。
1 async private void GetFile() 2 { 3 var files = await KnownFolders.PicturesLibrary.GetFilesAsync(); 4 this.DataContext = files; 5 }
“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的异步机制