zoukankan      html  css  js  c++  java
  • Windows store app[Part 4]:深入WinRT的异步机制

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

    WinRT异步机制回顾:

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

     IAsyncInfo:

    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有四个子接口。

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

    Dispatcher的变化:

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

    我们来看下WinRT的新变化。

    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:

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

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

    深入探究WinRT和await

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

  • 相关阅读:
    在GridView1的RowEditing获取GridView1里面绑定的某一字段
    仿淘宝网站的导航标签效果!
    ASP.NET Cookies简单应用 [ASP.NET | Cookies]
    UpdatePanel使用时注意说明
    Asp.net(C#)显示所有缓存 清除所有缓存
    计算字符在字符串是出现的次数
    新接触了ActionScript3.0 拿出来晒晒~
    转载Windows XP_32bit、Windows 7_32bit、Windows 7_64bit乱序任意安装方法
    新博客庆祝
    Android 电视关闭的动画效果
  • 原文地址:https://www.cnblogs.com/tmywu/p/3223305.html
Copyright © 2011-2022 走看看