2010-12-10 59 views
16

在我的应用程序中,我使用.NET SerialPort类来读取和写入数据。读取是使用DataReceived事件完成的,我假设它是在ThreadPool线程内部进行的。写作由UI线程(WinForms)完成。是否需要同步.NET SerialPort写入/读取?

我想知道,如果有必要同步对SerialPort实例的访问,以避免同时发生读/写操作。我的良知告诉我应该对这些调用进行锁定,但是我感到困惑,因为我在Internet上找到的所有C#SerialPort示例都根本不使用锁定。

+2

你一定要锁定。你在互联网上找到的例子很可能过于简单了。我试图使它成为一个规则,仔细阅读我正在尝试遵循的任何示例的文档,以防万一这样的事情被省略。 – 2010-12-10 15:42:47

回答

9

这里有一篇很棒的线程,与SerialPort类的参与作者:

MSDN: How does SerialPort handle DataReceived?

从我的经验,我已经写了十几个串行通信的应用程序使用硬件仿真器,我不要锁定。当时我不知道自己是否安全,但在实践中,我还没有犯错。 (20年以上的测试人员和自动测试机器几乎不间断地使用一年)。也就是说,如果我正在编写公共应用程序,我的应用程序不会离开公司,我可能会更加小心。

+1

感谢您提供优秀的信息链接 - 这是一个不错的发现。但我认为在做出像原始问题一样的设计决策时,不要过于依赖这些实施细节。确切地知道事情如何在引擎盖下工作很有趣也很好,但由于它没有正式记录,所以不能保证它会保持这种状态。文档(和最佳实践)建议您锁定,所以这就是我要做的,除非这样做有一个特殊的*缺点*。 – 2010-12-10 16:48:35

+0

哇,那个链接肯定会回答一些问题!我将使用锁,因为我还必须处理这样的场景,例如使用我的类中的相同成员引用关闭和重新连接串口,所以这些事情也必须同步 – Mike 2010-12-10 16:53:43

2

从文档:

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

所以你应该定义你的读/写与锁同步。

+1

是的,我知道措辞,这就是为什么我要首先同步这些电话。 – Mike 2010-12-10 15:41:48