Как я могу выполнять собственные асинхронные операции с WinRT, используя интерфейс IAsyncOperation?

Я разрабатываю приложение для метро и хочу создать несколько асинхронных операций, которые будут реализованы в моих собственных классах.

Я нашел только примеры асинхронного использования операций WinRT (например, CreateFileAsync). Я не нахожу ни одного случая, когда кто-то создает асинхронный метод и использует его.


person Claudio Junior    schedule 17.10.2011    source источник
comment
Почему бы вам просто не попробовать реализовать методы в соответствии с (довольно скудной) документацией?   -  person svick    schedule 18.10.2011
comment
Очевидно, вы не обладаете глубокими знаниями о том, о чем идет речь. Это то, что предлагает документация. Тем не менее, спасибо.   -  person Claudio Junior    schedule 18.10.2011
comment
Я не понимаю. В документации предлагается спросить у SO?   -  person svick    schedule 18.10.2011


Ответы (6)


Теперь вы можете это сделать. Посмотри на это:

http://blogs.msdn.com/b/nativeconcurrency/archive/2011/10/27/try-it-now-use-ppl-to-produce-windows-8-asynchronous-operations.aspx

http://code.msdn.microsoft.com/Windows-8-Asynchronous-08009a0d

Асинхронное производство WinRT с использованием C++

person Raman Sharma    schedule 31.10.2011

Используйте create_async в C++:

IAsyncOperationWithProgress<IBuffer^, unsigned int>^ RandomAccessStream::ReadAsync(IBuffer^ buffer, unsigned int count, InputStreamOptions options)
{
    if (buffer == nullptr)
        throw ref new InvalidArgumentException;

    auto taskProvider = [=](progress_reporter<unsigned int> progress, cancellation_token token)
    {
        return ReadBytesAsync(buffer, count, token, progress, options);
    };
    return create_async(taskProvider);
}

Используйте AsyncInfo.Run в .СЕТЬ:

public IAsyncOperation<IInfo> Async()
{
    return AsyncInfo.Run(_ =>
        Task.Run<AType>(async () =>
        {
            return await DoAsync();
        })
    );
}
person maxim pg    schedule 01.02.2013
comment
Есть ли сейчас ключевое слово await в C++/CX? И ТПЛ тоже? :) Но это все еще хороший совет для .NET. - person Filip Skakun; 02.02.2013
comment
Мне жаль. Язык в вопросе не указан. - person maxim pg; 02.02.2013

Я разместил тот же вопрос на форумах Microsoft, и они дали мне два ответа. Первый был:

Привет Клаудио,

В Developer Preview нет простого способа создания собственных асинхронных операций. Мы знаем об этом недостатке и пытаемся исправить его к следующему общедоступному релизу. Тем временем вы можете спроектировать свой API как асинхронный, и мы предоставим рекомендации о том, как преобразовать синхронизацию в асинхронность.

Спасибо

Раман Шарма, Visual C++

Когда я спросил, как это сделать, другой парень, ответственный за PPL, сказал мне:

Мы планируем обновить пакет примеров, который мы выпустили несколько недель назад, и добавить несколько примеров создания асинхронных операций. Я ожидаю, что это произойдет через пару недель или около того. Если вы следите за нашим блогом по адресу http://blogs.msdn.com/b/nativeconcurrency, ты узнаешь первым.

Что касается того, насколько это сложно... Решение общего назначения, которое мы обдумываем, состоит примерно из 1000 строк кода на C++, в котором обильно используется метапрограммирование шаблонов. Большая часть этого будет в заголовочном файле, так что вы можете изучить его самостоятельно. Хотя менее общее решение может быть менее сложным, вам все равно нужно будет реализовать базовый класс, выполнить управление состоянием, обработку ошибок и т. д. На данный момент я не могу вдаваться в подробности, но скажу, что вам понравится, как легко создавать асинхронные операции с PPL — так что держитесь!

Команда Артура Лаксберга PPL

Тогда решения на данный момент нет. Спасибо вам всем.

person Claudio Junior    schedule 18.10.2011

Да, см. доклад Бена Куна //BUILD/: http://channel9.msdn.com/events/BUILD/BUILD2011/PLAT-203T Он показывает, как создать асинхронный API.

В настоящее время нет хорошего решения для классов высокого уровня (C++/WX). Однако, если вы используете низкоуровневые интерфейсы C++, вы можете использовать класс WRL::AsyncBase для создания асинхронных интерфейсов.

Здесь находится документация по классу AsyncBase. .

person ReinstateMonica Larry Osterman    schedule 18.10.2011
comment
AFAICS, он показывает, как создать асинхронный интерфейс с использованием класса .Net AsyncInfoFactory, который недоступен в C++/CX. - person svick; 18.10.2011
comment
PPL — это долгосрочное решение, очевидно, что сейчас это не вариант. Но асинхронные API относительно просты. Взгляните на wrl\async.h, класс WRL::AsyncBase позволяет вам создать асинхронный класс C++. Обратите внимание, что он работает только с классами C++ низкого уровня, а не с классами высокого уровня, поэтому могут возникнуть некоторые проблемы с его работой в предварительных сборках для разработчиков. - person ReinstateMonica Larry Osterman; 18.10.2011
comment
Спасибо вам всем. Это кажется более разумным, хотя ожидайте MS с некоторым решением и шаблонами. Тем не менее, я возвращаюсь к этому материалу, но, как видите, они не побуждали меня идти по какому-либо пути. - person Claudio Junior; 20.10.2011

Это сбивает с толку, но есть разница между кодом WinRT C++ и WRL. Вы можете использовать WRL для прямого кода на уровне ABI. WRL не использует исключения, но любит шаблоны. Рекомендуемый стиль кодирования для WinRT отличается от WRL.

Я не уверен, что каждый может это сделать, но при использовании WRL вам обычно нужно реализовать класс, который наследует:

class CreateAysncOp: public RuntimeClass<IAsyncOperation<result_runtime_class*>,AsyncBase<IAsyncCompletedHandler<result_runtime_class*>>
{
...

Затем вы можете использовать

hr = MakeAndInitialize<CreateAsyncOp, IAsyncOperation<type_foo*>>(...);
person sam msft    schedule 27.02.2015

C++ WinRT теперь является лучшим способом реализации асинхронных методов WinRT. При этом используются co_await и co_return, новые функции языка C++ (в процессе стандартизации). Ознакомьтесь с документацией на эта страница.

person Chris Guzak    schedule 16.10.2018