7

我正在开发一个地铁应用程序,我想创建一些我自己的类将实现的异步操作。

我只找到了使用 WinRT 操作的异步示例(例如 CreateFileAsync)。我没有发现有人在创建异步方法并使用它的任何实例。

4

6 回答 6

4

现在你可以做到了。看这个:

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

使用 C++ 的 WinRT 异步生产

于 2011-10-31T06:28:42.143 回答
4

在 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();
        })
    );
}
于 2013-02-01T22:24:14.160 回答
2

是的,请参阅 Ben Kuhn 的 //BUILD/ 演讲:http ://channel9.msdn.com/events/BUILD/BUILD2011/PLAT-203T 他展示了如何构建异步 API。

目前,对于高级(C++/WX)类没有​​好的解决方案。但是,如果您使用低级 C++ 接口,则可以使用 WRL::AsyncBase 类来帮助构建您的异步接口。

是有关 AsyncBase 类的文档。

于 2011-10-18T04:58:49.000 回答
2

我在微软论坛上发布了同样的问题,他们给了我两个回复。第一个是:

嗨克劳迪奥,

在 Developer Preview 中,没有一种简单的方法可以创建您自己的异步操作。我们意识到了这个缺点,并正在努力在下一次公开发布时解决它。同时,您可以将您的 API 设计为异步,我们将提供有关如何将同步转换为异步的指导。

谢谢

拉曼夏尔马,Visual C++

当我问很难做到这一点时,另一个负责 PPL 的人对我说:

我们计划对几周前发布的示例包进行更新,并添加一些有关创建异步操作的示例。我预计它会在几周左右发生。如果您关注我们的博客http://blogs.msdn.com/b/nativeconcurrency,您将是第一个知道的。

至于它有多难……我们正在考虑的通用解决方案是大约 1000 行 C++ 代码,大量使用模板元编程。其中大部分将在头文件中,因此您可以自己探索。虽然不太通用的解决方案可以不那么复杂,但您仍然需要实现一个基类,进行状态管理,错误处理等。目前我无法详细说明,但我会说你会喜欢如何使用 PPL 编写异步操作很容易——所以坚持下去!

Artur Laksberg PPL 团队

那么,当时也没有解决办法。谢谢你们。

于 2011-10-18T11:31:19.887 回答
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*>>(...);
于 2015-02-27T22:54:44.807 回答
0

C++ WinRT 现在是实现 WinRT 异步方法的最佳方式。这使用co_awaitco_return,新的 C++ 语言特性(在标准化过程中)。阅读此页面上的文档。

于 2018-10-16T01:08:53.973 回答