• 【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>的实例。
  • 相关阅读:
    MySQL主从复制集群添加slave节点
    GTID主从 与 传统主从复制
    20201207总结
    202011051 每周例行报告
    202011121 每周例行报告
    202010081 每周例行报告
    202011261 每周例行报告
    202010153 每周例行报告
    202010291 每周例行报告
    202011201 每周例行报告
  • 原文地址:https://www.cnblogs.com/secbook/p/2655112.html
Copyright © 2020-2023  润新知