WPF,C#,串口通信

时间:2014-07-23 12:50:40

标签: c# wpf serial-port

我正在使用串口通信,有一个DataReceived串口事件,其中如果标题&收到的数据的页脚匹配我正在执行2复杂&冗长的函数,这里我用循环缓冲区进行数据接收,

在2个函数中,第一个函数更新Canvas&的2058字节的图形(面积图)。第二个函数在2058个字节上进行一些复杂的计算。我每隔3秒收到这2058个字节。

所以我的要求是当我在缓冲区中填充数据时,我需要在已经存在于缓冲区中的数据上执行这两个函数(因为它是包含先前填充数据的循环缓冲区)。

我在这里有点困惑,如何实现这种并发性。我知道一些方法,

  1. 使用'任务'
  2. 使用'主题'
  3. 使用' async&等待'
  4. 使用'任务并行库'
  5. 使用'背景工作者'
  6. 使用' Dispatcher.Invoke()'
  7. 目前我正在使用Dispatcher.Invoke(),这需要花费太多时间进行UI更新。所以这里发生了时滞。

    请建议我哪种方法会更敏感。

3 个答案:

答案 0 :(得分:2)

从要完成的工作量来判断,并且由于这是每三秒发生一次,我相信线程池上的任务和排队工作是您最好的解决方案。

我不建议产生新的专用线程。

根据此过程需要多长时间以及您的配置,我认为您可能会考虑在循环中运行少量永久线程并查询新接收数据的队列以进行处理(即创建自己的线程池)。这可以使用ConcurrentQueue来发布和接收数据。此外,您可以从考虑TPL.Dataflow中受益,这对于在多线程环境中需要低延迟和高性能的情况非常有用。无论采用何种解决方案,您都可以通过调查BufferBlock class from Dataflow来获益。

答案 1 :(得分:0)

您可以使用1-5进行复杂的工作(因为这些是针对此方案的)。您可以使用6将结果注入图中,因为Dispatcher.Invoke的目的是处理UI-Thread中的工作,并且是大多数控件所必需的。

我希望有所帮助。

答案 2 :(得分:0)

我已成功管理定时器和后台工作器同步。

我注意到的唯一重要的事情是你需要一个好的处理器,至少'核心 - i3'。

Mr.SKleanthous提出的解决方案也是可以接受的。感谢。

感谢AndreasMüller先生,是的,我明白了。

非常感谢大家。