为什么在串行端口打开和关闭之前线程.Sleep()

本文关键字:前线 线程 Sleep 串行端口 为什么 | 更新日期: 2023-09-27 18:00:02

我注意到我在SerialPort关闭和打开时读取的示例代码,人们会在SerialPort.Open()和Close()之前添加Thread.Sleep(1000)。如下所示:

Thread.Sleep(1000);
serialPort1.Open();
/* some code */
Thread.Sleep(1000);
serialPort1.Close();

我找不到任何解释。为什么人们会使用Thread.Sleep在打开或关闭串行端口之前阻止它?这是出于时间安排的目的吗?我应该放一个线程吗?每当我从串行端口读取或写入时都要休眠?

为什么在串行端口打开和关闭之前线程.Sleep()

打开端口时,SerialPort类会在引擎盖下启动一个新线程,该线程负责(通过WaitCommEvent Windows API函数)等待串行端口活动(例如数据到达)并向处理程序启动适当的事件。这就是为什么像DataReceived这样的事件实际上发生在辅助线程上的原因。

当您关闭端口时,close()调用会立即返回,但辅助线程需要一些时间才能降速。

如果在调用Close后尝试过快地重新打开端口,而线程尚未停止,则SerialPort实例不处于可以开始新连接的状态。

请注意SerialPort的MSDN文档。关闭状态:

任何应用程序的最佳实践都是等待在尝试调用Open之前调用Close方法后的时间方法,因为端口可能不会立即关闭。

您可以跟踪关闭端口的时间,并在再次打开端口之前确保经过了一些任意的超时。

读/写之前不需要睡觉,尽管需要记住一些怪癖:

  • Read可以返回比您要求的更少的字节
  • 有时DataReady事件不会触发
  • ReadTimeout可能有问题

请记住,.NET BCL中的SerialPort类仍然依赖于底层的Win32 API,我认为自从最初实现以来,它并没有得到微软的大力支持。

有关更多信息,请参阅:

  • http://www.innovatic.dk/knowledg/SerialCOM/SerialCOM.htm#SerialPortEvents

  • http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/f334ecce-eca3-46fd-8b65-27c02a1d4fea#10dae30d-bc75-49bb-a669-79399e58e1cc

  • SerialPort类偶尔挂在Dispose 上

每个SerialPort对象只能存在一个打开的连接。任何应用程序的最佳实践都是在调用Close方法后等待一段时间,然后再尝试调用Open方法,因为端口可能不会立即关闭。

请查看此链接。

我在C#中做了一些串行I/O程序,我想我从来没有添加过这样的睡眠。我没有遇到任何不良影响(需要注意的是,我的应用程序从未尝试快速连续打开和关闭串行端口)

你绝对不应该在阅读或写作前睡觉。