接上篇Windows store app[Part 3]:认识WinRT的异步机制html
WinRT异步机制回顾:web
IAsyncInfo接口:WinRT下异步功能的核心,该接口提供全部异步操做的基本功能,如标识、状态、操做。编程
IAsyncInfo:windows
1 public interface IAsyncInfo 2 { 3 AsyncStatus Status { get; } 4 HResult ErrorCode { get; } 5 uint Id { get; } 6 7 void Cancel(); 8 void Close(); 9 }
IAsyncInfo没有定义当操做完成时,通知监听器的回调方法的功能。从上篇能够知道基于IAsyncInfo有四个子接口。app
这四个子接口对上述功能进行了定义。异步
Dispatcher的变化:async
在WPF应用程序中经过Dispathcer.BeginInvoke通知UI线程进行异步操做。WinRT中摒弃了这种方式。ui
咱们来看下WinRT的新变化。spa
ThreadPool有一个RunAsync方法,参数是Worker项(要耗时作处理的工做)线程
1 public static IAsyncAction RunAsync(WorkItemHandler handler);
在UI线程中实现:
1 private void btnDoWork_Click(object sender, RoutedEventArgs e) 2 { 3 int result = 0; 4 var op = ThreadPool.RunAsync(delegate { result = Compute(); }) 5 op.Completed = delegate(IAsyncAction asyncAction, AsyncStatus asyncStatus) 6 { 7 Dispatcher.RunAsync(CoreDispatcherPriority.Normal, delegate 8 { 9 switch (asyncStatus) 10 { 11 case AsyncStatus.Completed: 12 btnDoWork.Content = result.ToString(); 13 break; 14 case AsyncStatus.Error: 15 btnDoWork.Content = asyncAction.ErrorCode.Message; 16 break; 17 case AsyncStatus.Canceled: 18 btnDoWork.Content = "A task was canceled"; 19 break; 20 } 21 }); 22 }; 23 }
ThreadPool执行完成时调用Completed的处理方法通知UI线程更新,这里使用Dispathcher.RunAsync与WPF程序中Dispatcher.BeginInvoke功能相同。
固然这样的写法在WinRt中能够更简化,经过async/await关键字,咱们把处理完成的回调操做交给WinRT去处理,从而不须要手动Code去处理回调操做。这种写法简化在处理连续执行多个异步操做时所需Code的大量代码。示例:
1 private async void btnDoWork_Click(object sender, RoutedEventArgs e) 2 { 3 try 4 { 5 int result = 0; 6 await ThreadPool.RunAsync(delegate { result = Compute(); }); 7 btnDoWork.Content = result.ToString(); 8 } 9 catch (Exception exc) { btnDoWork.Content = exc.Message; } 10 }
使用Async关键字带来的扩展
使用Async关键字标记方法时,编译器会使用状态机从新编写该方法的实施。关于编译器的处理方法能够参阅MSDN,async关键字编译器转换的相关内容。
在WinRT编程中咱们有时但愿一个方法的操做不是异步,而是同步的。这时咱们能够经过WinRT提供的Task任务类将其转换为任务并获取处理结果。如:
1 var files = StorageFolder.GetFilesAsync().AsTask().Results;
或者
1 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的反射机制