c#.Net 4.5线程之间的通信

c#.Net 4.5线程之间的通信,c#,wpf,multithreading,communication,can-bus,C#,Wpf,Multithreading,Communication,Can Bus,我正在构建一个应用程序,可以实时监控一些MCU硬件(传感器读数等)。对于通信,我使用CAN总线 基本上我现在有两个线程。一个是运行GUI的主线程,另一个是管理/监视设备之间的通信。所以很明显,我需要将数据从通信线程传递到gui线程。然而,正确的方法应该是什么?我知道如何在子线程完成工作后将数据传递回调用线程,但在这种情况下,通信线程一直在运行 当然,通信逻辑由一个单独的类(CANManager)表示 我有我自己的一些想法,但是我想知道什么是“正确的”方式,应该怎么做 一般来说,在任何编程语言中,

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

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

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

我有我自己的一些想法,但是我想知道什么是“正确的”方式,应该怎么做


一般来说,在任何编程语言中,你都需要考虑一个用于跨线程通信的PUB子体系结构。这意味着,对于希望向线程B发送消息的每个线程A,您应该将该线程中的“消息”或事件发布到队列中,以便在另一个线程空闲时被另一个线程使用。如果你只是在谷歌上搜索一下,你会发现有很多文章要读

具体来说,在.NET中,在另一个(任何)线程上调用方法或委托的方法是使用。这对于Windows窗体和WPF都是通用的,而WPF有一个与此框架不同的调度器,仅在UI线程上调用

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


TPL的一个特别有趣的模式是能够在一个线程上运行委托,然后在其他线程上链接多个操作,例如在完成或出错时。我将查看并考虑从异步方法返回任务,这样就可以了。 然而,正确的方法应该是什么?可能重复的请查看BackgroundWorker类,您可以在其中使用“ProgressChanged”事件:|在使用.NET 4.5时,您还可以使用Task类,它允许您在子进程完成后继续执行相同的进程:我最初的想法只是创建一个“存储类”将所有必要的值作为属性保存。因此,我可以从通信线程异步更新这些属性,然后将这些属性绑定到wpf。:)你是说“视图模型”吗?:)可以是。你可能已经猜到了,我不是oop和c的专家,因为我的主要工作是嵌入式c。但这能成为一件事吗?这似乎是最简单的事情,如果它有效的话?