Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么要在SerialPort.Open和Close之前使用Thread.Sleep()?_C#_Serial Port - Fatal编程技术网

C# 为什么要在SerialPort.Open和Close之前使用Thread.Sleep()?

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在串口打开或关闭之前阻塞它?是为了一些时间安排吗?我是否应该放置一个线程

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

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事件不会触发
请记住.NET BCL中的SerialPort类仍然依赖于底层的Win32 API,而且我认为自最初实现以来,它并没有得到Microsoft的很多喜爱

有关更多信息,请参阅:


如果睡眠是在打开和关闭之后进行的,那么这将更有意义,以便给它时间建立或结束连接。我知道,在ISA的糟糕旧时代,您必须小心不要将内容发送到端口太快,否则会导致问题。我想知道有多少情况仍然如此,有多少是货物崇拜?+1《濒危物种公约》提供了丰富的信息。我不得不把你当作新的答案。