【发布时间】:2011-02-23 19:53:25
【问题描述】:
全部
我有一个允许用户与多个串行设备通信的应用程序。 管理器类用于启动应用程序,它为每个串行设备创建一个新线程。在这个线程中,串行设备被创建,线程和串行设备对象被存储在管理器类中,以供以后需要时使用。
串行设备类然后在它自己的新线程上创建一个 com 端口类,用于连接到 com 端口并发送/接收数据。当接收到数据时,串行设备类会触发一个事件,该类又会向管理器类触发一个事件,管理器类又会向 UI 触发一个事件,以提醒用户新数据已到达。
我的问题是,当 com 端口类触发它的事件以通知串口类时,串口类接收到该事件并在 com 端口线程下继续处理。同样,如果用户将任何信息发送到 com 端口,它都会在 UI 线程下运行。
我稍后会添加代码作为编辑,但现在,如果有人能发现任何明显的东西,我会非常感激。
我尝试在串行设备类中接收事件,然后调用一个方法来查看它是否可以在正确的线程下运行,但这并不好。
我知道串行设备线程正在运行,因为我在创建它的 com 端口类后在类中运行 Application.Run。
我没有使用任何后台工作线程,因为这些线程在应用程序的整个生命周期中都存在,而且我知道后台工作线程旨在用于短期运行计算。
非常感谢
编辑:
忘了说,这是 .NET 2.0 中的 Winforms 应用,所以没有可用的 Dispatcher
编辑: 好的,看起来信息正在 DataReceived 线程中传递(我认为它也不是 com 端口线程)。 我还尝试将 BackgroundWorker 用于串行设备类,但这也没有任何区别。 帮忙?
【问题讨论】:
-
你在内部使用System.IO.Ports.SerialPort类吗?
-
很不清楚。你在使用 SerialPort.DataReceived 事件吗?那么是的,您在线程池线程上接收数据。您最终将不得不使用 Control.BeginInvoke() 来更新 UI。
-
是的,它是一个 winform 应用程序。接收事件不是问题。我收到所有通知,只是在错误的线程上。我想要做的是让串行设备类在它自己的线程上处理通知,而不是在 com 端口或 UI 线程上。是的,它正在使用 DataReceived 事件。
-
我的问题是,如果 UI 将更新发送到管理器,然后发送到串行设备类,然后发送到 com 端口类,我不希望它们都发生在UI线程,反之亦然。否则事情会被搁置
标签: c# multithreading .net-2.0 serial-port