我正在开发一款地铁应用,并且想要创建一些异步操作,让我的类来实现。
我只找到了使用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();
})
);
}
是的,可以看看Ben Kuhn在//BUILD/大会上的演讲:http://channel9.msdn.com/events/BUILD/BUILD2011/PLAT-203T。他展示了如何构建异步API。
目前,对于高级(C++/WX)类,还没有一个好的解决方案。但是,如果您使用低级别的C++接口,您可以使用WRL::AsyncBase类来帮助构建异步接口。
这里有关于AsyncBase类的文档。
虽然有点混乱,但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*>>(...);