我正在开发一个地铁应用程序,我想创建一些我自己的类将实现的异步操作。
我只找到了使用 WinRT 操作的异步示例(例如 CreateFileAsync)。我没有发现有人在创建异步方法并使用它的任何实例。
我正在开发一个地铁应用程序,我想创建一些我自己的类将实现的异步操作。
我只找到了使用 WinRT 操作的异步示例(例如 CreateFileAsync)。我没有发现有人在创建异步方法并使用它的任何实例。
在 C++ 中使用create_async :
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);
}
在 .NET 中使用AsyncInfo.Run:
public IAsyncOperation<IInfo> Async()
{
return AsyncInfo.Run(_ =>
Task.Run<AType>(async () =>
{
return await DoAsync();
})
);
}
我在微软论坛上发布了同样的问题,他们给了我两个回复。第一个是:
嗨克劳迪奥,
在 Developer Preview 中,没有一种简单的方法可以创建您自己的异步操作。我们意识到了这个缺点,并正在努力在下一次公开发布时解决它。同时,您可以将您的 API 设计为异步,我们将提供有关如何将同步转换为异步的指导。
谢谢
拉曼夏尔马,Visual C++
当我问很难做到这一点时,另一个负责 PPL 的人对我说:
我们计划对几周前发布的示例包进行更新,并添加一些有关创建异步操作的示例。我预计它会在几周左右发生。如果您关注我们的博客http://blogs.msdn.com/b/nativeconcurrency,您将是第一个知道的。
至于它有多难……我们正在考虑的通用解决方案是大约 1000 行 C++ 代码,大量使用模板元编程。其中大部分将在头文件中,因此您可以自己探索。虽然不太通用的解决方案可以不那么复杂,但您仍然需要实现一个基类,进行状态管理,错误处理等。目前我无法详细说明,但我会说你会喜欢如何使用 PPL 编写异步操作很容易——所以坚持下去!
Artur Laksberg PPL 团队
那么,当时也没有解决办法。谢谢你们。
这令人困惑,但 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*>>(...);
C++ WinRT 现在是实现 WinRT 异步方法的最佳方式。这使用co_await
和co_return
,新的 C++ 语言特性(在标准化过程中)。阅读此页面上的文档。