Нужен ли мне create_async в одноязычном приложении UWP?

Я хочу лучше понять задачи PPL в управляемом C++ (например, C++/CX). Один момент, который мне непонятен, это использование create_task против create_async. Документация MS говорит:

Используйте create_async только в том случае, если вам нужно создать функциональность, к которой можно получить доступ из другого языка или другого компонента среды выполнения Windows. Используйте класс задачи напрямую, если вы знаете, что операция создается и используется кодом C++ в одном и том же компоненте».

Итак, если я создаю асинхронные функции только в управляемом приложении C++ UWP, то использовать create_async бессмысленно, и мне лучше придерживаться исключительно create_task?


person Craig    schedule 10.04.2018    source источник


Ответы (1)


Обратите внимание, что C++/CX не является управляемым C++. Они имеют некоторые общие расширения синтаксиса (например, указатели «шляпы» с подсчетом ссылок), но C++/CX — это на 100 % собственный код, который не работает в управляемой среде выполнения CLR.

Тем не менее, использование create_async необходимо, если вы хотите предоставлять асинхронные операции через общедоступный интерфейс WinRT — независимо от того, является ли потребителем интерфейса C++, C#, JavaScript или другой язык. Это связано с тем, что create_async возвращает тип Windows::Foundation::IAsyncAction / IAsyncOperation<T>, который поддерживается WinRT и может использоваться (например) с помощью ключевого слова C# await.

Если вы вызываете свои функции только из другого кода C++ напрямую (т. е. не через общедоступный интерфейс WinRT), вам не требуется использовать create_async.

Также обратите внимание, что create_async и create_task делают разные вещи - первый запускает функтор как асинхронная операция и возвращает IAsyncFoo для использования другими компонентами WinRT, тогда как последний принимает значение IAsyncXyz от другого компонента WinRT и окружает его объектом task.

person Peter Torr - MSFT    schedule 18.04.2018