前文中提到过,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>的实例。