在 C# 中单独处理设备通信和 GUI 更新

本文关键字:通信 GUI 更新 单独 处理 | 更新日期: 2023-09-27 17:56:31

我正在开发一个应用程序,该应用程序以明确定义的时间间隔(例如每 5 分钟)扫描来自连接扫描仪的图像,持续指定的时间。当我的应用程序运行时,我有一个标签(timerlabel)倒计时项目的总时间,这由每秒更新标签的调度程序计时器处理。

扫描仪由另一个 DispatcherTimer 处理,该计时器每五分钟为每个扫描仪调用一个函数 Scan()。调用此功能时,扫描将开始,但 GUI 停止更新,并且计时器标签在扫描期间冻结。当它再次开始时,它只是不断倒计时,没有记录扫描过程中经过的时间。

如何使计时器标签在扫描过程中保持运行?

在 C# 中单独处理设备通信和 GUI 更新

尝试生成后台线程。与其直接调用 Scan(),不如让它在调用 Scan() 的委托或 lambda 上调用 BeginInvoke()。现在,Scan() 将在不同的线程中运行,使 UI 线程可以自由地响应图形消息。

如果 Scan() 将更新 UI 控件(如图像或文本框文本),则需要将任何此类逻辑封装在传递给窗口的 Invoke() 方法的委托中。这将防止"交叉线程",这在处理 UI 时很危险,并导致运行时引发异常。

虽然不确定是否获得完整的故事,但我会尝试通过 BackgroundWorker 启动您的Scan()方法,该方法支持通过内置的委托进行进度计量,在相应的 DispatchTimer() 触发时创建。