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的异步机制

最新文章

  1. 一眼看懂KMP匹配算法
  2. 项目总结(四)--- 网络封包分析工具Charles
  3. 前端学习资源(CSS+HTML5)
  4. ASP.NET的分页方法(四)
  5. java Socket用法详解(转)
  6. Aspose.cells异步读写操作
  7. Android简易实战教程--第十一话《获取手机所有应用信息Engine类详解》
  8. MASM中3中文本宏的使用与区别
  9. python测试开发django-15.查询结果转json(serializers)
  10. 【QT】error: Failed to retrieve MSVC Environment from "\VC\vcvarsall.bat":
  11. android------adb命令 pull或push手机和电脑文件交互
  12. 关于Cocos2d-x头文件的引用
  13. [翻译] PQFCustomLoaders
  14. ASP.NET前后端分离框架
  15. 关于 js 中的回调函数 callback
  16. zabbix邮件报警变量表
  17. 编写高质量代码改善C#程序的157个建议——建议58:用抛出异常代替返回错误代码
  18. 关于flume的几道题
  19. Java基础教程:多线程基础(1)——基础操作
  20. 【Codeforces】Gym 101173B Bipartite Blanket 霍尔定理+状压DP

热门文章

  1. Vim配置:在win10下用vim编译运行C/C++(异步插件管理,一键运行)
  2. C#中有关数组和string引用类型或值类型的判断
  3. LightGBM
  4. Python基础语法习题一
  5. Linux实战教学笔记43:squid代理与缓存实践(二)
  6. Opencv convertScaleAbs
  7. 行走于Swift的世界中(转)
  8. 建立spring项目入门实例
  9. 设计模式--适配器模式(Adapter)详解
  10. code1796 社交网络