在单语言UWP应用程序中是否需要create_async?

时间:2018-04-10 15:08:39

标签: c++ task c++-cx ppl

我想更好地理解托管C ++中的PPL任务(如C ++ / CX)。我不清楚的一点是使用create_task vs create_async。 MS文档说:

  

仅在必须创建可从其他语言或其他Windows运行时组件访问的功能时才使用create_async。当您知道该操作是由同一组件中的C ++代码生成和使用时,请直接使用该任务类。“

因此,如果我只在托管C ++ UWP应用程序中创作异步函数,那么使用create_async毫无意义,我最好只使用create_task吗?

1 个答案:

答案 0 :(得分:1)

请注意,C ++ / CX 不是托管C ++。它们共享一些常见的语法扩展(如ref-counting" hat"指针),但C ++ / CX是100%本机代码,不能在托管CLR运行时运行。

也就是说,如果要通过公共WinRT接口公开异步操作,则需要使用ring - 无论接口的使用者是C ++,C#,JavaScript还是其他语言。这是因为create_async返回create_async,这是WinRT支持的类型,可以通过C#Windows::Foundation::IAsyncAction / IAsyncOperation<T>关键字使用(例如)。

如果您只是直接从其他C ++代码调用您的函数(即,不通过公共WinRT接口),那么您不需要使用await

另请注意create_asynccreate_task执行不同的操作 - 前者将仿函数作为异步操作运行并返回create_async以供其他WinRT组件使用,而后者接受来自另一个WinRT组件的IAsyncFoo值,并在其周围包裹IAsyncXyz个对象。