如何为 IAsyncOperation<TResult> 列表实现 when_all

How to implement when_all for list of IAsyncOperation<TResult>

如题:IAsyncOperation列表如何实现类似concurrency::when_all的方法?

此致, 迈克尔

基于此thread,您可以手动定义一个when_all模板。但是它需要你将每个任务作为参数传递。

更新:

如果想在when_all方法中放一个IAsyncAction的vector,可以参考这个thread。例如:

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方法来实现它。