C++/WinRT 是微软为 Windows 运行时提供的现代 C++17 语言投影,于 2018 年引入(Windows SDK 版本 10.0.17134.0)。
异步操作方法
假设有一个耗时很长的方法,不希望它阻塞 UI 线程,可以使用以下模式:
#include <dispatcherqueue.h>
#include <winrt/base.h>
#include <winrt/Windows.System.h>
#include <winrt/Windows.Foundation.h>
winrt::Windows::Foundation::IAsyncAction readImg() {
co_await winrt::resume_background();
// 这里省略了耗时很长的逻辑代码
co_await winrt::resume_foreground(dq);
}
winrt::Windows::Foundation::IAsyncAction 代表一个无结果、无进度的异步操作。WinRT 提供了如下异步操作类型:
| 类型 | 返回值 | 进度报告 | 使用场景 |
|---|---|---|---|
IAsyncAction | 无 | 无 | 简单异步操作 |
IAsyncActionWithProgress<T> | 无 | 有 | 需要进度反馈的操作 |
IAsyncOperation<T> | 有 | 无 | 返回结果的异步操作 |
IAsyncOperationWithProgress<T, P> | 有 | 有 | 返回结果且需进度的操作 |
若要在方法中使用 co_await 操作异步逻辑,必须将该方法标记为 co_await 兼容方法,例如返回 IAsyncAction 类型。
co_await winrt::resume_background() 是 C++/WinRT 提供的线程切换辅助函数,用于从当前线程切换到后台线程(背后有池线程支持),该操作是非阻塞的。
co_await winrt::resume_foreground(dq) 负责从后台线程切换到当前线程。


