WPF, c#,串口通信
本文关键字:通信 串口 WPF | 更新日期: 2023-09-27 18:14:16
我使用串口通信,有一个串口的DataReceived
事件,其中如果标头&收到的数据匹配页脚,我正在执行2复杂&冗长的函数,这里我使用循环缓冲区来接收数据,
在2个函数中,第一个函数更新画布上2058字节的图形(面积图)&第二个函数在2058字节上执行一些复杂的计算。我每隔3秒收到这2058字节。
所以我的要求是,当我在另一边的缓冲区中填充数据时,我需要对已经在缓冲区中的数据执行这2个函数(因为它是循环缓冲区,它包含以前填充的数据)。
我在这里有点困惑,如何实现这种并发。我知道一些方法,
- 使用"任务"
- 使用'Threads'
- 使用'async &等待'
- 使用"任务并行库"
- 使用'Background Worker'
- 使用"Dispatcher.Invoke()的
目前我正在使用Dispatcher.Invoke()
,这需要太多的时间为UI更新。所以这里有时间滞后。
请告诉我哪种方法反应更快。
从要完成的工作的大小来判断,并且由于这每三秒钟发生一次,我相信在线程池上执行任务和排队工作是您的最佳解决方案。
我不建议生成一个新的专用线程。根据这个过程需要多长时间和你的配置,我认为你可以考虑在一个循环中运行少量的永久线程,并查询新接收到的数据队列进行处理(即创建你自己的线程池)。这可以通过使用ConcurrentQueue发送和接收数据来实现。你也可以从考虑TPL中受益。数据流,它可以极大地帮助在多线程环境中需要低延迟和高性能的情况。无论采用哪种解决方案,您都可以从研究Dataflow中的BufferBlock类中获益。
您可以使用1-5来完成复杂的工作(因为这些是针对这个场景的)。您可以使用6将结果注入到图中,因为Dispatcher的目的。调用是ui线程中的处理工作,大多数控件都需要调用。
我已经成功地管理了计时器和后台工作同步。
我注意到的唯一重要的事情是你需要一个好的处理器,至少是"core - i3"。
Mr.SKleanthous提出的解决方案也可以接受。谢谢。
谢谢Andreas m谢谢大家。