【问题标题】:How to return an array asyc, writing a Windows Runtime Component in C++/WinRT如何返回数组 asyc,在 C++/WinRT 中编写 Windows 运行时组件
【发布时间】:2019-10-28 15:59:59
【问题描述】:

如果 TResult 是数组,则不允许将 IAsyncOperation 作为返回类型,从用 C++/WinRT 编写的 Windows 运行时组件异步返回数组的最佳方法是什么?

可以将数组包装在 PropertyValue 中,但对数组进行装箱和拆箱都会创建副本,这似乎效率低下。目前,我正在做的是编写一个自定义组件来存储 com_array(它有一个允许我在 com_array 中移动的构造函数),使用 DetachArray 函数将数组返回给调用者。这是最好的方法吗?看起来有点复杂?另外,在这种情况下,如果我从 C# 调用 DetachArray 函数,是否复制了数组?我不知道托管和非托管内存之间的交互是如何工作的。我假设使用 com_array 而不是 std::vector 与此有​​关。

【问题讨论】:

    标签: c++-winrt


    【解决方案1】:

    需要传递的 IAsyncOperation 的 TResult 是 Windows Runtime 类型。如果你想返回一个数组,你可以尝试使用Windows::Foundation::Collections::IVector 作为一个集合对象,而不是winrt::com_array。在这种情况下,它会很方便,不需要装箱或拆箱。例如:

    Windows::Foundation::IAsyncOperation<Windows::Foundation::Collections::IVector<hstring>> Class::MyMethod()
    {
        Windows::Foundation::Collections::IVector<hstring> coll1{ winrt::single_threaded_vector<hstring>() };
        ......
        co_return coll1;
    }
    

    【讨论】:

    • 感谢您的回复。但是,我想返回一个数组,而不是 Windows 运行时对象,因为我需要访问它以提高效率并且不涉及互操作。这将是一个大字节数组——可能高达 100MB,所以我正在寻找最有效的方法。另外希望有人能回答我关于数组是否被复制的问题。
    • 移动阵列是怎么回事?你的意思是你使用了 std::move() 方法?您能否详细说明如何存储 com_array 和 DetachArray 函数?
    • 实现看起来像这样 CustomByteArray::CustomByteArray(com_array&& givenBytes) { swap(givenBytes, bytes); } com_array CustomByteArray::DetachArray() { com_array temp{};交换(字节,临时);返回温度;有一个名为 'bytes' 的私有成员 com_array。 com_array 有一个已删除的复制构造函数,因此将由 move 返回。
    • 如果想要字节数组,可以使用IBuffer。否则,DetachArray 似乎正在充分利用糟糕的情况。
    猜你喜欢
    • 2020-02-22
    • 1970-01-01
    • 2020-12-23
    • 2020-09-19
    • 2019-05-20
    • 2016-01-01
    • 1970-01-01
    • 2015-05-30
    • 2012-12-10
    相关资源
    最近更新 更多