Windows store app[Part 4]:深入WinRT的异步机制
接上篇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:
使用Windows运行时中异步性来始终保持应有程序能够快速流畅地运行
下篇:Windows store app[Part 5]:WinRT的反射机制
Windows store app[Part 4]:深入WinRT的异步机制的更多相关文章
- Windows store app[Part 3]:认识WinRT的异步机制
WinRT异步机制的诞生背景 当编写一个触控应用程序时,执行一个耗时函数,并通知UI更新,我们希望所有的交互过程都可以做出快速的反应.流畅的操作感变的十分重要. 在连接外部程序接口获取数据,操作本地数 ...
- 在桌面程序上和Metro/Modern/Windows store app的交互(相互打开,配置读取)
这个标题真是取得我都觉得蛋疼..微软改名狂魔搞得我都不知道要叫哪个好.. 这边记录一下自己的桌面程序跟windows store app交互的过程. 由于某些原因,微软的商店应用的安全沙箱导致很多事情 ...
- Windows Store App 过渡动画
Windows Store App 过渡动画 在开发Windows应用商店应用程序时,如果希望界面元素进入或者离开屏幕时显得自然和流畅,可以为其添加过渡动画.过渡动画能够及时地提示用户屏幕所发 ...
- Windows store app[Part 1]:读取U盘数据
Windows 8系统下开发App程序,对于.NET程序员来说,需要重新熟悉下类库. 关于WinRT,引用一张网上传的很多的结构图: 图1 针对App的开发,App工作在系统划定的安全沙箱内,所以通过 ...
- 05、Windows Store app 的图片裁切(更新)
在 Win Phone Silverlight api 中,有一个 PhotoChooserTask 选择器,指定宽.高属性,在选择图片的时候, 可以进行裁切,代码: PhotoChooserTask ...
- 01、Windows Store APP 设置页面横竖屏的方法
在 windows phone store app 中,判断和设置页面横竖屏的方法,与 silverlight 中的 Page 类 不同,不能直接通过 Page.Orientation 进行设置.而是 ...
- Windows store app Settings 的 应用 ( viewmodel + windows.storage)
1.在首页 加入 一个元素(加下滑线的).此元素绑定了两个属性 <!DOCTYPE html> <html> <head> <meta charset=&qu ...
- windows store app 如何计算字符所占的宽度
最近在做一个PDF电子文档相关的项目,我们的app是运行在Windows 8 / WinRT 下的.由于使用的第三方库的一些技术限制,text area竟然不支持多行文本自动换行.于是我们就需要自己实 ...
- Windows Store App JavaScript 开发:获取文件和文件夹列表
在应用程序中有时可能需要获取用户库中的内容,以便执行相关的操作.如果要获取某个用户库中的内容,需要先获取到这个用户库,获得用户库可以通过Windows.Storage命名空间中的KnownFolder ...
随机推荐
- c#中如何获取本机用户名、MAC地址、IP地址、硬盘ID、CPU序列号、系统名称、物理内存
我们在利用C#开发桌面程序(Winform)程序的时候, 经常需要获取一些跟系统相关的信息, 以下这些代码获取能有些用处. c#中如何获取本机用户名.MAC地址.IP地址.硬盘ID.CPU序列号.系统 ...
- rtmp一些状态信息详解-as连接FMS服务器报错状态汇总~~
原地址:http://help.adobe.com/zh_CN/AIR/1.5/jslr/flash/events/NetStatusEvent.html 下表说明了 code 和 level 属性可 ...
- 为什么是static?
为什么是static因为系统开始执行一个程序前,并没有创建main()方法所在类的实例对象,它只能通过类名类调用主方法. public static void main(String args[])我 ...
- Ajax 简单实例,其实就是js里面内容有些不同而已(转载)
这些时间,瞎子也看得见,AJAX正大踏步的朝我们走来.不管我们是拥护也好,反对也罢,还是视而不见,AJAX像一阵潮流,席转了我们所有的人. 关于AJAX的定义也好,大话也好,早有人在网上发表了汗牛充栋 ...
- go_切片
go语言中切片相当于array的一个view.其底层实现如下ptr指的是slice中打头的元素.len表示slice的长度.cap表示ptr到整个array的长度 slice可以向后扩展,但不能超过对 ...
- 利用fetch进行POST传参
fetch(config.host+"url",{ method:"POST", mode: 'cors',跨域请求 headers: { ...
- 802.11bgn信道划分及WirelessMon规划频段
一.802.11bgn模式支持14信道,第14信道一般不使用.对应频率范围如下: Channel Frequency range Central Frequency ----------------- ...
- BMP结构详解
位图BITMAPINFOHEADER 与BITMAPFILEHEADER: 先来看BITMAPINFOHEADER,只写几个主要的biSize包含的是这个结构体的大小(包括颜色表) biWidt ...
- easyui combogrid 下拉框 智能输入
1. 后台代码 using System;using System.Collections;using System.Collections.Generic;using System.Linq;usi ...
- gitlab centos 安装配置运维笔记
写在前面 如果你需要一个git服务器,为企业或自己的团队托管代码而又不希望将代码仓库存储到第三方.你可以在自己的服务器上搭建一个gitlab. 本文为我在最初安装配置gitlab服务器的时候留存的笔记 ...