WinUI3桌面C++项目调用winrt::resume_foreground编译失败求助
问题根因
WinUI 3桌面项目中winrt::Microsoft::UI::Xaml::Window返回的DispatcherQueue属于winrt::Microsoft::UI::Dispatching命名空间,和UWP生态下Windows.System命名空间的旧版DispatcherQueue、Windows.UI.Core命名空间的CoreDispatcher属于完全不同的类型。你之前引入的头文件仅提供了旧类型对应的resume_foreground重载,无法匹配WinUI 3的新DispatcherQueue类型。另外不存在winrt/Microsoft.System.h这个头文件,所以包含后会触发找不到文件的报错。
解决方案
- 在项目的预编译头文件
pch.h中添加对应命名空间的头文件引用:
#include <winrt/Microsoft.UI.Dispatching.h>
- 重新编译项目即可,此时
winrt::resume_foreground会自动匹配winrt::Microsoft::UI::Dispatching::DispatcherQueue类型的入参,你原有代码无需修改即可正常运行。
旧版本兼容方案
如果你使用的Project Reunion 0.8版本仍不支持该重载,可直接用TryEnqueue替代resume_foreground实现调度逻辑,效果一致:
winrt::Windows::Foundation::IAsyncAction App::foo() { // 假设此处为后台线程执行的逻辑 co_await winrt::resume_background(); auto dispatcher = window.DispatcherQueue(); dispatcher.TryEnqueue([=]() { // 此处编写需要在UI线程执行的逻辑 }); }
内容的提问来源于stack exchange,提问作者Markus
相关产品推荐
相关产品推荐

