4

我正在构建一个可以实时监控一些 MCU 硬件(传感器读数等)的应用程序。对于通信,我使用的是 CAN 总线。

基本上我现在有2个线程。一个是运行 GUI 的主线程,另一个是管理/监控设备之间的通信。所以显而易见的是,我需要将数据从通信线程传递到 gui 线程。但是,正确的方法应该是什么?我知道当子线程完成工作时如何将数据传回调用线程,但在这种情况下,通信线程一直在运行。

当然,通信逻辑由一个单独的类(CANManager)表示。

我有自己的一些想法,但是我想知道应该如何做到这一点的“正确”方式是什么。

提前致谢 :)

4

1 回答 1

5

通常,在任何编程语言中,您都需要考虑使用 pub-sub 架构进行跨线程通信。这意味着对于希望向线程 B 发送消息的每个线程 A,您应该将该线程中的“消息”或事件发布到队列中,以便在空闲时由另一个线程使用。如果您只是 google ' Cross Thread communication c# ',您会发现许多文章可供阅读。

具体来说,在 .NET 中,在另一个(任何)线程上调用方法或委托的方法是使用SynchronizationContext。这对 Windows 窗体和 WPF 都很常见,而 WPF 有一个与此框架不同的 Dispatcher,只能在 UI 线程上调用。

有许多框架、库、模式可用于执行这种技术。其中之一是任务并行库。TPL 允许您创建任务或任务并在线程池、UI、相同或特定线程上调用它。TPL 允许通过使用Schedulers进行线程编组。您可以使用内置的调度程序或创建自己的调度程序。调度程序在其核心使用 SynchronizationContext 来进行线程编组。

TPL 的一种特别有趣的模式是能够在一个线程上运行委托,然后在其他线程上链接多个操作,例如在完成或出错时。我会研究任务异步模式并考虑从异步方法返回任务,以便您可以使用 ContinueWith 链接它们

于 2013-11-22T10:04:35.230 回答