为什么在SerialPort.Open和Close之前的Thread.Sleep()?

时间:2011-06-22 02:38:30

标签: c# serial-port

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

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

我无法在任何地方找到任何解释。为什么人们在打开或关闭之前使用Thread.Sleep来阻塞串口?它是出于某种计时目的吗?我是否应该在读取或写入串行端口时放入Thread.Sleep?

3 个答案:

答案 0 :(得分:10)

当您打开一个端口时,SerialPort类会启动一个新线程,负责(通过WaitCommEvent Windows API函数)等待串口活动(例如数据到达)并向您的处理程序发送相应的事件。这就是DataReceived等事件实际发生在辅助线程上的原因。

关闭端口时,Close()调用会立即返回,但辅助线程需要一段时间才能停止运行。

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

请注意MSDN documentation for SerialPort.Close州:

  

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

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

在读/写之前无需睡觉,但要记住一些怪癖:

请记住,.NET BCL中的SerialPort类仍然依赖于底层的Win32 API,我认为自从最初的实现以来,它已经得到了很多人的喜爱。

有关详细信息,请参阅:

答案 1 :(得分:3)

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

看看这个link

答案 2 :(得分:1)

我在C#中完成了一些串行I / O程序,我认为我从未添加过这样的睡眠。我没有经历过任何不良影响(需要注意的是我的应用程序从未试图快速连续打开和关闭串口)

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