WinUI3踩坑记 – 后台线程刷新UI

心血来潮想写个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

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注