6

Я разрабатываю приложение метро, ​​и я хочу создать некоторые операции async, чьи собственные классы будут реализованы.Как я могу выполнить асинхронные операции с WinRT с помощью интерфейса IAsyncOperation?

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

+0

Почему бы» t вы просто пытаетесь реализовать методы в соответствии с (довольно скудной) документацией? – svick

+0

Очевидно, что у вас нет глубоких знаний о том, что задействовано. Это то, что предлагает документация. Даже так спасибо. –

+2

Я не понимаю. В документации предлагается спросить в SO? – svick

ответ

2

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

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

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

Благодаря

Raman Sharma, Visual C++

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

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

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

Артур Laksberg PPL команда

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

2

Да, см. «БЕН КУН» // СТРОИТЕ/РАЗДЕЛ: http://channel9.msdn.com/events/BUILD/BUILD2011/PLAT-203T Он показывает, как построить асинхронный API.

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

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

+0

AFAICS, он показывает, как построить асинхронный интерфейс с использованием .Net-класса 'AsyncInfoFactory', который недоступен в C++/CX. – svick

+1

PPL - это долгосрочное решение, очевидно, что сейчас это не вариант. Но асинхронные API-интерфейсы относительно просты. Взгляните на wrl \ async.h, класс WRL :: AsyncBase позволяет создать асинхронный класс C++. Обратите внимание, что он работает только с низкоуровневыми классами C++, а не с классами высокого уровня, поэтому могут возникнуть некоторые проблемы с тем, чтобы это работало над сборками предварительного просмотра разработчиков. –

+0

Спасибо всем. Кажется более разумным, хотя ожидать MS с некоторыми решениями и шаблонами. Тем не менее, я возвращаюсь к этому материалу, но, как вы можете видеть, они не поощряли меня следовать по любому пути. –

4

Использование 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(); 
     }) 
    ); 
} 
+0

Теперь это ключевое слово ожидания в C++/CX? И TPL тоже? :) Но это все еще хороший совет для .NET. –

+0

Прошу прощения. Язык не задан в вопросе. –

+0

Я также добавил пример кода C++. –

0

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