【WPF】后台线程(包括串口等设备线程)安全的访问前台UI元素

问题描述

写的一个程序,WPF界面,与串口、相机等硬件设备通信,并将通信结果(包括图片等)显示在UI界面上。期间发现有串口被其他线程占用,在Debug模式下关闭程序后,程序无法退出等情况。
具体表现为:
(1)关闭程序后,下次再次启动程序,串口被占用,新的程序无法访问串口;表现为报串口异常:
“Access to the port ‘COM8’ is denied.
An exception of type System.UnauthorizedAccessException occurred and was caught.”
(2)有时候,关闭上一个程序后,程序未能完全退出:
(a)一种表现为虽然界面都关闭了,但是进程管理器中还有;
(b)另一种表现为,debug模式下运行程序。当把程序关闭后,VS还一直处于调试状态,无法退出程序,表示当前程序还在运行,VS下暂停程序,显示程序正在运行相机线程的销毁中,正在以下语句中等待,表明线程一直无法退出。

m_monitorThread.Join(); 

问题探索

随后,在网上搜索了类似情况。比较有用的有:
【1】C# 串口操作系列(2) – 入门篇,为什么我的串口程序在关闭串口时候会死锁
其中说的是普通的UI的操作情况。

随后,对我的程序进行了分析,发现也存在类似情况。于是进行了改进。
在上面的文章有分析,这里结合我的程序,这里简单说下:
(1)串口线程、相机线程单独工作,当有消息时,他们会回调函数进行界面UI元素的更新。在我的程序中,图像的更新频率很高,20帧/秒。串口回调也比较频繁。
这里有两种更新方式:
(a)直接更新UI控件元素,例如图片的ImgSrc。
(b)更新绑定了前端显示控件的属性。
这两种具体更新的机制不是十分清除,但估计也是需要等待UI,等待wpf的锁定资

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值