1

对于可等待对象(或只是) ,是否有与Promise.allC++ 或 C++/WinRT 中的JavaScript 等效Windows.Foundation.IAsyncAction

例如,我正在尝试收集多个 IAsyncAction 并在它们全部完成后继续。现在我开始每个动作,然后在一个简单的循环中一个接一个地等待它们:

winrt::IAsyncAction AwaitMultiple(std::vector<winrt::IAsyncAction> actions)
{
    for (const auto& action : actions)
    {
        co_await action;
    }
}

// ... somewhere else...

winrt::IAsyncAction MyFunctionAsync()
{
    std::vector<winrt::IAsyncAction> actions{};
    actions.push_back(/* some function that generates an IAsyncAction */);
    actions.push_back(/* some function that generates an IAsyncAction */);
    actions.push_back(/* some function that generates an IAsyncAction */);
    // ... etc...

    co_await AwaitMultiple(actions);

    // ... do other stuff...
}

有一个更好的方法吗?有语言方式吗?

4

1 回答 1

2

通常情况下,几乎这种情况确实有一个 C++/WinRT 函数:(winrt::when_all(T... async)目前没有在Advanced concurrency and asyncyny with C++/WinRT中记录)。

如果您有现代 C++/WinRT,您可以一次等待多个操作:

winrt::IAsyncAction MyFunctionAsync()
{
    const auto myAction = /* function that generates an IAsyncAction */;
    const auto myAction2 = /* function that generates an IAsyncAction */;
    const auto myAction3 = /* function that generates an IAsyncAction */;

    // magic!
    co_await winrt::when_all(myAction, myAction2, myAction3);
}

这类似于并行模式库 (PPL)when_all

这并不能解决std::vector<winrt::IAsyncAction>上述问题,但幸运的是 Raymond Chen 有一些关于此的帖子:

一位客户想知道如何将 IAsyncAction 对象的 std::vector 传递给 when_all 函数。

std::vector<IAsyncAction> actions = get_actions();
for (auto&& action : actions) co_await action;

[...更多有关尝试将其包装在重载中的内容winrt::when_all...]

从你已经拥有的片段中合成一个 when_all 协程


也可以看看:

于 2022-01-28T20:58:50.343 回答