我想更好地理解托管C ++中的PPL任务(如C ++ / CX)。我不清楚的一点是使用create_task vs create_async。 MS文档说:
仅在必须创建可从其他语言或其他Windows运行时组件访问的功能时才使用create_async。当您知道该操作是由同一组件中的C ++代码生成和使用时,请直接使用该任务类。“
因此,如果我只在托管C ++ UWP应用程序中创作异步函数,那么使用create_async毫无意义,我最好只使用create_task吗?
答案 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_async
和create_task
执行不同的操作 - 前者将仿函数作为异步操作运行并返回create_async
以供其他WinRT组件使用,而后者接受来自另一个WinRT组件的IAsyncFoo
值,并在其周围包裹IAsyncXyz
个对象。