C++ WinRT 中的异步无效

Async void in C++ WinRT

我想在 C++/WinRT 的 void Page::OnNavigatingFrom(NavigatingCancelEventArgs const&) 方法中调用非阻塞代码。

在 C# 中,我可以简单地使用 async void,如 in this answer 所示,但据我了解,异步方法需要 return IAsyncAction(或其中之一其他接口)以便我能够使用 co_await

有谁知道在上述 OnNavigatingFrom 方法中调用异步方法的方法,还是我必须求助于同步调用它们(我相信使用 .get())?

概念,其中

you have a task that can be done concurrently with other work, and you don't need to wait for that task to complete (no other work depends on it), nor do you need it to return a value

通常被称为 "fire and forget". C++/WinRT provides the fire_and_forget 结构,在这些情况下可以用作 return 类型。要使用它,您需要更改

的声明
void Page::OnNavigatingFrom(NavigatingCancelEventArgs const&)

winrt::fire_and_forget Page::OnNavigatingFrom(NavigatingCancelEventArgs)

这使您(或框架)无需 co_await 即可调用 OnNavigatingFrom。该实施在任何时候都可以免费 co_awaitco_return

与任何协同例程一样,请确保 接受 (const) 引用。它会在第一个暂停点失效,并在适当的时候发生混乱。传递值可靠地解除了这把 C++ 脚枪。