zoukankan      html  css  js  c++  java
  • 【windows8开发】异步编程之Concurrency::create_async(C++)

           前文中提到过,Concurrency::task支持异步处理,但是由于它不支持跟其他语言的交互,所以如果希望开发的组件能在其他语言,比如C#,Javascript,VB中使用的话,就需要多语言交互的API,它就是Concurrency::create_async。
           我们把Concurrency::task和Concurrency::create_async两种处理方式对照来看。
           如果我们的组件本身以及调用方都只可能是C++的话,我们会使用Concurrency::task来实现异步处理。因为它更直接,所以效率也更高。假设也许我们会设计如下这样的异步处理方法:
    Concurrency::task<vector<int>> GetFileContentAsync() {
         return Concurrency::task<vector<int>>([]() {
                  // 异步处理
         });
    }
    Concurrency::task的说明请参照《【windows8开发】异步编程之Concurrency::task(C++)
           那么反之,如果组件会在C++之外的语言中使用,我们就应该使用Concurrency::create_async方法,所以上面使用Concurrency::task的处理我们会改为使用Concurrency::create_async:
    IAsyncOperation<IVector<int>^>^ GetFileContentAsync() {
         return Concurrency::create_async([]() ->IVector<int>^ {
                   // 异步处理
         });
    }

    是不是有点难理解,让我来解释下上面的异步处理方式吧。
    WinRT提供了4种异步处理的接口方式,
    1. Windows::Foundation::IAsyncAction : 无返回值,无处理进度报告
    2. Windows::Foundation::IAsyncActionWithProgress<TProgress>:无返回值,有处理进度报告
    3. Windows::Foundation::IAsyncOperation<TResult>:有返回值,无处理进度报告
    4. Windows::Foundation::IAsyncOperationWithProgress<TResult, TProgress>:有返回值,有处理进度报告 

            而Concurrency::create_async方法的参数是个Lambda表达式,也就是匿名函数指针。而create_async能根据Lambda表达式中的参数和返回值来决定4种接口中的一种作为返回类型。现在可以看出上面的异步处理中,create_async参数Lambda表达式(匿名函数)是无参数的,所以它就是无处理进度报告的,而Lambda表达式的返回值类型为IVector<int>^,所以create_async就是有返回值得。综合来看上述异步处理就应该是有返回值,无处理进度报告对应的IAsyncOperation<TResult>

    如果想参照create_async的使用实例,可以参考这篇这篇文章中,其中就有返回值为IAsyncOperationWithProgress<TResult, TProgress>的实例。
  • 相关阅读:
    laravel 创建自定义全局函数
    JAVA堆栈的区别
    项目经验-国家电网
    OO开发思想:面向对象的开发方法(Object oriented,OO)
    分层开发思想
    软件开发过程与思想
    json学习笔记
    UNIX网络编程——UDP 中的外出接口的确定
    UNIX网络编程——UDP缺乏流量控制(改进版)
    UNIX网络编程——UDP 的connect函数(改进版)
  • 原文地址:https://www.cnblogs.com/secbook/p/2655112.html
Copyright © 2011-2022 走看看