xno*_*mex 4 c# wpf multithreading communication can-bus
我正在构建一个应用程序,可以实时监控一些 MCU 硬件(传感器读数等)。对于通信,我使用的是 CAN 总线。
基本上我现在有 2 个线程。一个是运行 GUI 的主线程,另一个是管理/监控设备之间的通信。所以显而易见的是,我需要将数据从通信线程传递到 gui 线程。然而,正确的做法应该是什么?我知道如何在子线程完成工作后将数据传递回调用线程,但在这种情况下,通信线程一直在运行。
当然,通信逻辑由单独的类(CANManager)表示。
我有自己的一些想法,但是我想知道应该如何做到这一点的“正确”方式是什么。
提前致谢 :)
通常,在任何编程语言中,您都需要考虑用于跨线程通信的 pub-sub 架构。这意味着对于希望向线程 B 发送消息的每个线程 A,您应该将来自该线程的“消息”或事件发布到队列中,以便在空闲时由另一个线程使用。如果您只是在 google 上搜索“跨线程通信 c# ”,您会发现许多文章可供阅读。
具体来说,在 .NET 中,在另一个(任何)线程上调用方法或委托的方法是使用SynchronizationContext。这对于 Windows Forms 和 WPF 都是通用的,而 WPF 有一个 Dispatcher,它与这个框架不同,只能在 UI 线程上调用。
有许多框架、库、模式可用于执行此类技术。其中之一是任务并行库。TPL 允许您创建任务或任务并在线程池、UI、相同或特定线程上调用它。TPL 允许通过使用Schedulers进行线程编组。您可以使用内置的调度程序或创建自己的调度程序。调度程序在其核心使用 SynchronizationContext 来进行线程编组。
TPL 的一种特别有趣的模式是能够在一个线程上运行委托,然后在其他线程上链接多个操作,例如在完成或错误时。我会研究Task Asynchronous Pattern并考虑从异步方法返回 Task 以便您可以使用 ContinueWith 链接它们。