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

  • 相关阅读:
    html表格,table标签
    2-3VRP的基本配置
    6 sys模块
    3 datetime模块
    2 time模块
    1 模块和包的介绍
    12 函数进阶---生成器
    13 函数进阶---迭代器
    10 函数进阶---闭包
    11 函数进阶---装饰器
  • 原文地址:https://www.cnblogs.com/tmywu/p/3211111.html
Copyright © 2020-2023  润新知