接上篇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. Netty面试题

    1.BIO.NIO和AIO的区别? BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理.线程开销大. 伪异步IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源. N ...

  2. rails scaffold生成的crud显示自定义的列名

    1. 访问 rails i18n 插件的官方网站 ,查看信息http://guides.rubyonrails.org/i18n.html2. 在Gemfile 中加入  测试rails4.2.1不用 ...

  3. MySQL数据库篇之索引原理与慢查询优化之二

    接上篇 7️⃣  正确使用索引 一.索引未命中 并不是说我们创建了索引就一定会加快查询速度,若想利用索引达到预想的提高查询速度的效果, 我们在添加索引时,必须遵循以下问题: #1 范围问题,或者说条件 ...

  4. https 理解

    这张图已经很明白,以下为翻译: 一.秘钥传输过程(确认秘钥相同) 1.请求服务端 2.服务端有公司要 3.公钥发给客户端 4.验证发过来的公钥crt,生成随机秘钥,并用此公钥加密 5.加密后的秘钥发给 ...

  5. WPF Shader 正片叠底

    新建文本文档拷贝以下代码 //正片叠底sampler2D implicitInput : register(s0);sampler2D oldInput : register(s1);float4 m ...

  6. 88. Merge Sorted Array (Array)

    Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: Y ...

  7. css的优先级和权重问题 以及!important优先级

    一,前言: 刚加的css怎么没有渲染出来?浏览器中查看,发现是被其他的css给覆盖了,相信我们都曾遇到过这样的问题.那么浏览器是如何选择css标签的渲染顺序的呢?换句话说,css选择器的优先级是怎么规 ...

  8. NavigationController.viewControllers

      NSMutableArray *viewControllersArray = [NSMutableArray new];    // 获取当前控制器数组    for (CardLoanBaseT ...

  9. code2198 数字三角形WWW

    数字三角形的新变种 设要经过的点为x y,那么dp[x][k] = -Max    k=1~x and k!=y 其他一样:dp[i][j] = max(dp[i-1][j],dp[i-1[j-1]) ...

  10. python3--json序列化

    # Auther: Aaron Fan # 把数据存入到一个文件中 # json格式的数据几乎可以通用语任何编程语言,但是仅仅只是简单的格式转换# 比如:字典.列表.元组.字符串这些,像函数.类就不可 ...