【问题标题】:Is it necessary to synchronize .NET SerialPort writes/reads?是否有必要同步 .NET SerialPort 写入/读取?
【发布时间】:2010-12-11 01:09:11
【问题描述】:

在我的应用程序中,我使用 .NET SerialPort 类来读取和写入数据。读取是使用 DataReceived 事件完成的,我假设在 ThreadPool 线程内部。编写由 UI 线程(WinForms)完成。

我想知道,是否有必要同步对 SerialPort 实例的访问,这样就不会同时发生读/写。我的良心告诉我应该在这些调用周围加锁,但我很困惑,因为我在 Internet 上找到的所有 C# SerialPort 示例根本不使用锁定。

【问题讨论】:

  • 你绝对应该锁定。您在 Internet 上找到的示例很可能过于简单化。对于我尝试遵循的任何示例,我都尝试将仔细阅读文档作为一项规则,以防这样的内容被省略。

标签: c# .net serial-port


【解决方案1】:

这是一个关于该主题的精彩帖子,SerialPort 类的作者参与:

MSDN: How does SerialPort handle DataReceived?

根据我的经验,我编写了十几个串行通信应用程序用作硬件模拟器,我不锁定。我当时不知道我是否安全,但在实践中,我还没有出错。 (20 多位测试人员和自动化测试机器几乎持续使用一年)也就是说,我的应用程序不会离开公司,如果我正在编写供公众使用的应用程序,我可能会更加小心。

【讨论】:

  • 感谢您提供的优秀且内容丰富的链接——这是一个不错的发现。但我认为在做出像原始问题那样的设计决策时,应该注意不要过分依赖这些实现细节。确切地知道事情是如何运作的很有趣也很好,但鉴于它没有正式记录,因此不能保证它会保持这种状态。文档(和最佳实践)建议您锁定,所以我会这样做,除非这样做有特定的缺点
  • 哇,这个链接肯定回答了一些问题!我将使用锁,因为我还必须使用类中的相同成员引用来处理关闭和重新连接串行端口等场景,因此这些事情也必须同步
【解决方案2】:

来自文档:

这种类型 (SerialPort) 的任何公共静态(在 Visual Basic 中为 Shared)成员都是线程安全的。不保证任何实例成员都是线程安全的。

所以你应该明确地将你的读/写与锁同步。

【讨论】:

  • 是的,我知道这个措辞,这就是我首先要同步这些调用的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
相关资源
最近更新 更多