【问题标题】:SerialPort DataReceived Event ThreadingSerialPort DataReceived 事件线程
【发布时间】:2019-03-18 16:25:30
【问题描述】:

根据 MSDN 的 DataReceived 事件,它说

当从 SerialPort 对象接收到数据时,在辅助线程上引发 DataReceived 事件。

这是否意味着只有一个辅助线程总是触发事件?或者 SerialPort 对象是否在每次触发 DataReceived 事件时创建一个新线程?那么当我在DataReceived 事件中时,我的DataReceived 事件会触发吗?

我试图用谷歌搜索,但找不到好的答案。

【问题讨论】:

  • 每次都是相同的事件。您使用“+=”注册一次事件。如果您关闭连接,则每次打开连接时都需要注册,然后每次都会有所不同。
  • 我知道每次都是同一个事件,但是该事件是从 SerialPort 对象的线程调用的。如果该线程每次都不同,那么当您在该事件中执行其他操作时,可以从另一个线程调用该事件。但是,如果它是从同一个线程中调用的,那就不可能了。
  • 发明是一种自动切换进程的中断,可以从应用程序的任何位置调用。
  • 您可以通过实际操作来检查它。线程 ID 应由该 API 获取。 Thread.ManagedThreadId Property

标签: c# serial-port


【解决方案1】:

根据MSDN论坛here上的这篇帖子。

当它这样做时,在你的情况下收到的数据,它会浸入 ThreadPool 并调用 QueueUserWorkItem() 将线程池线程分配给 调用您的 DataReceived 事件处理程序。然后它立即调用 WaitCommEvent() 再次等待下一个“有趣的事情”。

听起来SerialPort 对象使用了ThreadPool,所以虽然DataReceived 事件在不同的Threads 上被调用,但它们已经存在于ThreadPool 中,因此创建新事件没有开销.

因此,即使您在其中也有可能触发事件,因为它将位于不同的线程上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多