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

记一个关于OVS-DPDK, ./configure失败的原因

configure: error: Failed to link with DPDK, check the config.log for more details. If a working DPDK library was not found in the default search path, update PKG_CONFIG_PATH for pkg-config to find the .pc file in a non-standard location.

在进行OVS-DPDK编译的时候遇到了以上报错

首先根据提示查询是否pkg-config找不到libdpdk.pc

pkg-config --modversion libdpdk

22.11.1

这里看起来dpdk编译后是正常的,那就根据提示检查config.log, 发现ld报错

cannot find -libverbs

查了下机器上是有个libibverbs.so.1, 建了个软连接到libibverbs.so

ln -s libibverbs.so.1 libibverbs.so

再次配置成功通过