【问题标题】:c# .Net 4.5 Communication between threadsc# .Net 4.5 线程间通信
【发布时间】:2023-12-10 10:30:02
【问题描述】:

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

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

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

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

提前致谢:)

【问题讨论】:

  • 但是正确的做法应该是什么?可能与google.com.au/search?q=wpf+invoke+on+main+thread重复
  • 查看 BackgroundWorker 类,您可以在其中使用“ProgressChanged”事件:msdn.microsoft.com/en-us/library/… |当您使用 .NET 4.5 时,您还可以使用 Task 类,它可以让您在子进程完成后继续执行相同的进程:msdn.microsoft.com/en-us/library/dd270696(v=vs.110).aspx
  • 我最初的想法只是创建一个“存储类”,它将所有必要的值作为属性保存。所以我可以从我的通信线程异步更新这些属性,然后将这些属性绑定到 wpf。 :)
  • 您的意思是“ViewModel”吗? :)
  • 可能是。正如您可能已经猜到的那样,我不是 oop 和 c# 方面的专家,因为我的主要工作是嵌入式 c。但这可能是一回事吗?如果可行,这似乎是最简单的事情?

标签: c# wpf multithreading communication can-bus


【解决方案1】:

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

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

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

一种特别有趣的 TPL 模式是能够在一个线程上运行委托,然后在其他线程上链接多个操作,例如在完成或错误时。我会查看Task Asynchronous Pattern 并考虑从异步方法返回Task,以便您可以chain on them using ContinueWith

【讨论】: