您的位置:首页 > 编程语言 > C语言/C++

【windows8开发】异步编程入门篇之 Concurrency::create_async(C++)

2012-04-24 11:36 393 查看
前文中提到过,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>的实例。
【windows8开发】C++开发WinRT组件和JS调用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: