心血来潮想写个WinUI3玩玩,发现坑真不少,开个文章记录下这些乱七八糟的坑
设计了一个场景,与服务器建联后,应用接受服务器发送来的数据, 经过处理后实时显示到UI上
为了保持与服务器的长链,并且实现切换页面后依旧能正常获取数据, 这里将与服务器通信的部分单独设计成了一个Client, 想法是通过Client来更新ViewModel, ViewModel变动后就会自动通知UI更新界面
结果发现, 当活动页面为需要更新的页面时,集合更新的通知就会失效, 重新进入页面后数据会正常显示出来
分析后发现问题出在, 由于是通过Client来更新ViewModel的, 所以实际上通知发生在Worker线程, 负责刷新UI的UI线程没有收到通知
ok, 找到原因, 来处理, 反正就是获取当前Active的窗口然后拿线程呗,看看文档

CoreDispatcher.RunAsync / CoreDispatcher.RunIdleAsync
接口在这, 在ViewModel内获取看看

NULL
那再试试直接从Window获取看看

还是NULL
很奇怪, 无论怎么样都拿不到UI线程, 开始网上冲浪寻找解决方案, 最后终于在StackOverflow找到个回答
c# – A WinUI 3 question about accessing the UI thread from another thread – Stack Overflow

发现在WinUI3中, CoreDispatcher拿UI线程和Window拿UI线程的方法都被废弃了….
Windows Runtime APIs not supported in desktop apps – Windows apps | Microsoft Learn

根据文档换DispatcherQueue试试


前端正常渲染出来了
总结:
还得多找文档, 微软这废弃接口IDE内也没提示
参考文章:
Windows Runtime APIs not supported in desktop apps – Windows apps | Microsoft Learn
c# – A WinUI 3 question about accessing the UI thread from another thread – Stack Overflow