为什么在串行端口打开和关闭之前线程.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在打开或关闭串行端口之前阻止它?这是出于时间安排的目的吗?我应该放一个线程吗?每当我从串行端口读取或写入时都要休眠?
打开端口时,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程序,我想我从来没有添加过这样的睡眠。我没有遇到任何不良影响(需要注意的是,我的应用程序从未尝试快速连续打开和关闭串行端口)
你绝对不应该在阅读或写作前睡觉。