如何为 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方法来实现它。
如题: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方法来实现它。