zoukankan      html  css  js  c++  java
  • 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操作感。

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

  • 相关阅读:
    动态生成 Excel 文件供浏览器下载的注意事项
    JavaEE 中无用技术之 JNDI
    CSDN 泄露用户密码给我们什么启示
    刚发布新的 web 单点登录系统,欢迎下载试用,欢迎提建议
    jQuery jqgrid 对含特殊字符 json 数据的 Java 处理方法
    一个 SQL 同时验证帐号是否存在、密码是否正确
    PostgreSQL 数据库在 Windows Server 2008 上安装注意事项
    快速点评 Spring Struts Hibernate
    Apache NIO 框架 Mina 使用中出现 too many open files 问题的解决办法
    解决 jQuery 版本升级过程中出现 toLowerCase 错误 更改 doctype
  • 原文地址:https://www.cnblogs.com/tmywu/p/3211111.html
Copyright © 2011-2022 走看看