Как вернуть массив asyc, написав Windows Runtime Component в C ++ / WinRT - PullRequest
1 голос
/ 25 октября 2019

Каков наилучший способ асинхронного возврата массива из компонента среды выполнения Windows, написанного на C ++ / WinRT, при условии, что IAsyncOperation не допускается в качестве возвращаемого типа, если TResult является массивом?

ЭтоМожно обернуть массив внутри PropertyValue, но как упаковка, так и распаковка массива создают копии, что кажется неэффективным. На данный момент я пишу собственный компонент для хранения com_array (у которого есть конструктор, который позволяет мне перемещаться в com_array) с функцией DetachArray, которая перемещает массив по возвращении вызывающей стороне. Это лучший способ - кажется немного сложным? Кроме того, в этом случае, если я вызываю функцию DetachArray из C #, копируется ли массив или нет? Я не знаю, как работает взаимодействие между управляемой и неуправляемой памятью. Я предполагаю, что использование com_array в отличие от std :: vector как-то связано с этим.

1 Ответ

1 голос
/ 28 октября 2019

TResult для IAsyncOperation должен быть передан типом среды выполнения Windows. Если вы хотите вернуть массив, вы можете попробовать использовать 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;
}
...