你怎么能在 C++/WinRT lambda 中 `co_await`?

How can you `co_await` in a C++/WinRT lambda?

你能在 C++/WinRT TimerElapsedHandler(或 C++/WinRT 中的任何其他 lambda)中 co_await 吗?

当我尝试编译这样的代码时:

auto pointerExitedTimerHandler = winrt::TimerElapsedHandler([](const winrt::ThreadPoolTimer&)
{
    co_await 5s;

    // Other stuff...
});

我收到一个错误:

error C7588: A definition of a class template std::experimental::task must be provided for the return type of this coroutine to be deduced

如何编写异步处理程序?

您只需要提供一个异步 return 类型。例如,-> winrt::fire_and_forget:

auto pointerExitedTimerHandler = winrt::TimerElapsedHandler([](const winrt::ThreadPoolTimer&) -> winrt::fire_and_forget
{
    co_await 5s;

    // Other stuff...
});

Fire and forget 是忽略结果的异步函数的简单 WinRT 包装器——如果您需要等待结果,则需要使用不同的 return 类型。