接上篇Windows store app[Part 3]:认识WinRT的异步机制

WinRT异步机制回顾:

IAsyncInfo接口:WinRT下异步功能的核心,该接口提供所有异步操作的基本功能,如标识、状态、操作。

IAsyncInfo:

 public interface IAsyncInfo
{
AsyncStatus Status { get; }
HResult ErrorCode { get; }
uint Id { get; } void Cancel();
void Close();
}

IAsyncInfo没有定义当操作完成时,通知监听器的回调方法的功能。从上篇可以知道基于IAsyncInfo有四个子接口。

这四个子接口对上述功能进行了定义。

Dispatcher的变化:

在WPF应用程序中通过Dispathcer.BeginInvoke通知UI线程进行异步操作。WinRT中摒弃了这种方式。

我们来看下WinRT的新变化。

ThreadPool有一个RunAsync方法,参数是Worker项(要耗时做处理的工作)

 public static IAsyncAction RunAsync(WorkItemHandler handler);

在UI线程中实现:

 private void btnDoWork_Click(object sender, RoutedEventArgs e)
{
int result = ;
var op = ThreadPool.RunAsync(delegate { result = Compute(); })
op.Completed = delegate(IAsyncAction asyncAction, AsyncStatus asyncStatus)
{
Dispatcher.RunAsync(CoreDispatcherPriority.Normal, delegate
{
switch (asyncStatus)
{
case AsyncStatus.Completed:
btnDoWork.Content = result.ToString();
break;
case AsyncStatus.Error:
btnDoWork.Content = asyncAction.ErrorCode.Message;
break;
case AsyncStatus.Canceled:
btnDoWork.Content = "A task was canceled";
break;
}
});
};
}

ThreadPool执行完成时调用Completed的处理方法通知UI线程更新,这里使用Dispathcher.RunAsync与WPF程序中Dispatcher.BeginInvoke功能相同。

当然这样的写法在WinRt中可以更简化,通过async/await关键字,我们把处理完成的回调操作交给WinRT去处理,从而不需要手动Code去处理回调操作。这种写法简化在处理连续执行多个异步操作时所需Code的大量代码。示例:

 private async void btnDoWork_Click(object sender, RoutedEventArgs e)
{
try
{
int result = ;
await ThreadPool.RunAsync(delegate { result = Compute(); });
btnDoWork.Content = result.ToString();
}
catch (Exception exc) { btnDoWork.Content = exc.Message; }
}

使用Async关键字带来的扩展

使用Async关键字标记方法时,编译器会使用状态机重新编写该方法的实施。关于编译器的处理方法可以参阅MSDN,async关键字编译器转换的相关内容。

在WinRT编程中我们有时希望一个方法的操作不是异步,而是同步的。这时我们可以通过WinRT提供的Task任务类将其转换为任务并获取处理结果。如:

 var files = StorageFolder.GetFilesAsync().AsTask().Results;

或者

 var files = StorageFolder.GetFilesAsync().AsTask().GetAwaiter()

这样就可以实现直接等待WinRt异步操作的结果,而不使用Async/Await。
AsTask还支持取消操作(CancellationToken )、进度(IProgress<T> ),通过ContinueWith实现任意多次的回调。其中

还包括WhenAll 和WhenAny 操作,可以通过MSDN了解其用途。

至此我们已经了解了WinRT的内部操作机制。如果对其了解还不够透彻,提供以下Windows开发人员官方博客进行释疑,希望能帮到大家理解这些概念。

Link:

将.NET 任务作为WinRT异步操作公开

使用Windows运行时中异步性来始终保持应有程序能够快速流畅地运行

深入探究WinRT和await

下篇:Windows store app[Part 5]:WinRT的反射机制

Windows store app[Part 4]:深入WinRT的异步机制的更多相关文章

  1. Windows store app[Part 3]:认识WinRT的异步机制

    WinRT异步机制的诞生背景 当编写一个触控应用程序时,执行一个耗时函数,并通知UI更新,我们希望所有的交互过程都可以做出快速的反应.流畅的操作感变的十分重要. 在连接外部程序接口获取数据,操作本地数 ...

  2. 在桌面程序上和Metro/Modern/Windows store app的交互(相互打开,配置读取)

    这个标题真是取得我都觉得蛋疼..微软改名狂魔搞得我都不知道要叫哪个好.. 这边记录一下自己的桌面程序跟windows store app交互的过程. 由于某些原因,微软的商店应用的安全沙箱导致很多事情 ...

  3. Windows Store App 过渡动画

    Windows Store App 过渡动画     在开发Windows应用商店应用程序时,如果希望界面元素进入或者离开屏幕时显得自然和流畅,可以为其添加过渡动画.过渡动画能够及时地提示用户屏幕所发 ...

  4. Windows store app[Part 1]:读取U盘数据

    Windows 8系统下开发App程序,对于.NET程序员来说,需要重新熟悉下类库. 关于WinRT,引用一张网上传的很多的结构图: 图1 针对App的开发,App工作在系统划定的安全沙箱内,所以通过 ...

  5. 05、Windows Store app 的图片裁切(更新)

    在 Win Phone Silverlight api 中,有一个 PhotoChooserTask 选择器,指定宽.高属性,在选择图片的时候, 可以进行裁切,代码: PhotoChooserTask ...

  6. 01、Windows Store APP 设置页面横竖屏的方法

    在 windows phone store app 中,判断和设置页面横竖屏的方法,与 silverlight 中的 Page 类 不同,不能直接通过 Page.Orientation 进行设置.而是 ...

  7. Windows store app Settings 的 应用 ( viewmodel + windows.storage)

    1.在首页 加入 一个元素(加下滑线的).此元素绑定了两个属性 <!DOCTYPE html> <html> <head> <meta charset=&qu ...

  8. windows store app 如何计算字符所占的宽度

    最近在做一个PDF电子文档相关的项目,我们的app是运行在Windows 8 / WinRT 下的.由于使用的第三方库的一些技术限制,text area竟然不支持多行文本自动换行.于是我们就需要自己实 ...

  9. Windows Store App JavaScript 开发:获取文件和文件夹列表

    在应用程序中有时可能需要获取用户库中的内容,以便执行相关的操作.如果要获取某个用户库中的内容,需要先获取到这个用户库,获得用户库可以通过Windows.Storage命名空间中的KnownFolder ...

随机推荐

  1. 跟我学算法-pca(降维)

    pca是一种黑箱子式的降维方式,通过映射,希望投影后的数据尽可能的分散, 因此要保证映射后的方差尽可能大,下一个映射的方向与当前映射方向正交 pca的步骤: 第一步: 首先要对当前数据(去均值)求协方 ...

  2. IO操作中的建议

    程序输出信息使用PrintStream(或者PrintWriter),程序输入信息使用Scaner

  3. Junit Test 的时候出错java.lang.IllegalStateException: Failed to load ApplicationContext

    问题原因 JDK1.8    spring版本3.2.0RELEASE JDK和spring版本不兼容 解决方法 1.降低JDK版本到1.7 2.将spring的版本升级到4.0.0RELEASE或者 ...

  4. ubuntu10.10手工安装jdk1.6

    声明:以下操作是在root用户下操作. 一.下载JDK首先,在Oracle的官网上下载JDK.http://www.oracle.com/technetwork/java/javase/downloa ...

  5. 第二个MFC实例:GPA计算器

    一.目的:此文通过一个GPA计算器的制作,介绍基于对话框的应用程序的编程方法.常用控件的编程技巧以及控件外观的更改技巧. 二.功能描述:所谓GPA计算器,即进行GPA换算. 功能要求由如下几点: 1. ...

  6. 143. Reorder List(List)

    Given a singly linked list L: L0→L1→…→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do th ...

  7. c++ 备忘录模式(memento)

    备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态[DP].举个简单的例子,我们玩游戏时都会保存进度,所保存的进度以文件的 ...

  8. ActiveMQ 使用文档

    一.为什么使用ActiveMQ 在总线的设计中可能会使用到JMS(Java Message Service)通道, Java消息服务(JMS)超越了生产商专有的MOM(Message-Oriented ...

  9. TortoiseSVN教程

    TortoiseSVN使用教程 TortoiseSVN是一个SVN的客户端 1.Checkout Repository 首先要Checkout服务器端的Repository,所谓的Checkout就是 ...

  10. 约瑟夫问题的变种 LA3882

    题目大意: N个数排成一圈,第一次删除m,以后每k个数删除一次,求最后一被删除的数. 如果这题用链表或者数组模拟整个过程的话,时间复杂度都将高达O(nk),而n<=10000,k<=100 ...