Как реализовать when_all для списка IAsyncOperation <TResult> - PullRequest
0 голосов
/ 20 января 2020

Как в заголовке: Как реализовать метод, похожий на параллелизм :: when_all для списка IAsyncOperation?

С уважением, Михал

1 Ответ

0 голосов
/ 21 января 2020

Исходя из этого потока , вы можете определить шаблон when_all вручную. Но вам нужно передать каждую задачу в качестве параметра.

Обновление:

Если вы хотите поместить вектор IAsyncAction в метод when_all, вы можете обратиться к этому нить . Например:

MainPage.h

template <typename T>
Windows::Foundation::IAsyncAction when_each(T first, T last)
{
    for (; first != last; ++first)
    {
        co_await *first;
    }
}

struct MainPage : MainPageT<MainPage>
{
    MainPage();

    Windows::Foundation::IAsyncAction wait_for(Windows::Foundation::TimeSpan duration);

    Windows::Foundation::IAsyncAction ClickHandler(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::RoutedEventArgs const& args);
};

MainPage. cpp:

#include <debugapi.h>

using namespace winrt;
using namespace Windows::UI::Xaml;
using namespace std::chrono;

Windows::Foundation::IAsyncAction MainPage::wait_for(Windows::Foundation::TimeSpan duration)
{
    co_await duration;
    hstring formattedText = L"done" + to_hstring(duration.count());
    OutputDebugString(formattedText.c_str());
}

Windows::Foundation::IAsyncAction MainPage::ClickHandler(IInspectable const&, RoutedEventArgs const&)
{
    std::vector v{ wait_for(4s), wait_for(2s), wait_for(3s) };
    co_await when_each(v.begin(), v.end());
}

Результат вывода:

выполнено 20000000 выполнено 30000000 сделано 40000000

Затем вы можете заменить метод wait_for асинхронными c операциями для его достижения.

...