C# 为什么要在SerialPort.Open和Close之前使用Thread.Sleep()?
我注意到我在SerialPort关闭和打开时读到的示例代码,人们会在SerialPort.Open()和Close()之前添加Thread.Sleep(1000)。例如:C# 为什么要在SerialPort.Open和Close之前使用Thread.Sleep()?,c#,serial-port,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(1000);
serialPort1.Open();
/* some code */
Thread.Sleep(1000);
serialPort1.Close();
我到处找不到任何解释。为什么人们使用Thread.Sleep在串口打开或关闭之前阻塞它?是为了一些时间安排吗?我是否应该放置一个线程。无论何时读取或写入串行端口,我都要睡眠?每个串行端口对象只能存在一个打开的连接。任何应用程序的最佳实践都是在调用Close方法后等待一段时间,然后再尝试调用Open方法,因为端口可能不会立即关闭
看看这个。我用C#编写了几个串行I/O程序,我想我从来没有添加过这样的睡眠。我没有经历过任何不良影响(注意我的应用程序从未尝试快速连续打开和关闭串行端口)
你绝对不应该在阅读或写作前睡觉 打开端口时,SerialPort类会在引擎盖下触发一个新线程,该线程负责(通过WaitCommEvent Windows API函数)等待串行端口活动(例如数据到达)并向处理程序触发适当的事件。这就是为什么像DataReceived这样的事件实际上发生在辅助线程上 关闭端口时,close()调用会立即返回,但辅助线程需要一些时间才能降速 如果在调用Close后尝试过快地重新打开端口,而线程尚未停止,则SerialPort实例未处于可以开始新连接的状态 注意到各国: 任何应用程序的最佳实践都是等待一定数量的 在尝试调用Open之前调用Close方法后的时间 方法,因为端口可能不会立即关闭 您可以跟踪关闭端口的时间,在再次打开端口之前,请确保经过了一些任意超时 在读/写之前不需要睡觉,但要记住以下几点:
- Read返回的字节数可能少于您要求的字节数
- 有时DataReady事件不会触发