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

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

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

Ответы [ 6 ]

4 голосов
/ 02 февраля 2013

Использовать 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 в .NET:

public IAsyncOperation<IInfo> Async()
{
    return AsyncInfo.Run(_ =>
        Task.Run<AType>(async () =>
        {
            return await DoAsync();
        })
    );
}
4 голосов
/ 31 октября 2011

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

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 Async Production с использованием C ++

2 голосов
/ 18 октября 2011

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

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

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

Спасибо

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

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

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

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

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

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

2 голосов
/ 18 октября 2011

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

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

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

0 голосов
/ 16 октября 2018

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

0 голосов
/ 28 февраля 2015

Это сбивает с толку, но есть разница между кодом 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*>>(...);
...