Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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# 通过不同线程同时读取和写入串行端口是否安全?_C#_.net_Serial Port - Fatal编程技术网

C# 通过不同线程同时读取和写入串行端口是否安全?

C# 通过不同线程同时读取和写入串行端口是否安全?,c#,.net,serial-port,C#,.net,Serial Port,通过不同线程(一个读线程和一个写线程)同时读取和写入串行端口是否安全?是否有必要在每个线程中的读/写操作周围添加锁定?我希望您描述的具体情况是,1个读线程和1个写线程是安全的 硬件上的读写通道设计为全双工,软件也应设计为支持全双工。 虽然我找不到关于这一点的明确声明,但上的示例也从主线程写入,而在另一个线程上读取。无锁定。来自以下文件: 此类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的。任何实例成员都不能保证线程安全 因为读和写不是静态的,所以它们不是线程安全的。无论如

通过不同线程(一个读线程和一个写线程)同时读取和写入串行端口是否安全?是否有必要在每个线程中的读/写操作周围添加锁定?

我希望您描述的具体情况是,1个读线程和1个写线程是安全的

硬件上的读写通道设计为全双工,软件也应设计为支持全双工。
虽然我找不到关于这一点的明确声明,但上的示例也从主线程写入,而在另一个线程上读取。无锁定。

来自以下文件:

此类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的。任何实例成员都不能保证线程安全

因为读和写不是静态的,所以它们不是线程安全的。无论如何,这是一个非常糟糕的主意,因为SerialPort类为您维护内部缓冲区


您需要将I/O与串行端口同步。

从不同线程“同时”读取和写入串行端口是处理串行端口通信的标准方式:一个线程处理读取,另一个线程处理写入。可以接受

有许多基于串行的设备异步向主机发送数据,同时仍允许向设备本身发送命令:条形码扫描仪、标签扫描仪和照相机等设备

问题?

尝试同步与设备之间的通信时会出现问题

例如,您希望编写一个命令,然后立即读回任何响应。在这种情况下,您将挂起读取线程,并在写入命令后手动读取所有串行端口数据。处理完命令后,读取线程可以再次启动

摘要


一般来说,我建议只有一个额外的线程来处理端口数据的所有读取并触发事件,例如
DataReceived
,并从主线程执行所有写入操作。

但是SerialPort是一种特殊情况,在软硬件中由单独的读取和写入通道组成。使用2个读线程需要锁定。是的,如果你的读线程从不写,而你的写线程从不读,那么应该可以。但是,这是一个实现细节,文档中没有明确说明这是允许的,所以理论上,这可能会在未来的.NET版本中发生变化。此外,我不能保证这是其他平台上的行为,例如在CF上使用SerialPort。我个人不会这样做,因为API的文档没有明确允许。公认的答案是错误的。MSDN充满了缺失的细节。MSDN中没有明确提到线程安全这一事实可能仅仅意味着微软的文档团队忘记了提及它。在写答案之前,你应该先研究一下源代码。内部SerialPort使用一个类SerialStream,该类使用API CreateFile(“\\.\COM1”)打开一个双向COM端口。使用ReadFile()读取数据,并使用WriteFile()API写入数据。因此,如果一个线程只写,而另一个线程只读,那么SerialPort绝对是线程安全的。现在,在原始答案十年后,该链接没有引用的短语。相反,这里没有提到线程安全。Mike J,那将是额外的1个线程。我猜你打算从主线开始写?叶。一般来说,这是我认为可以接受的方法。但正如我所发现的,问题确实在于读写的同步,这可能是一种彻头彻尾的痛苦:-)你“会”期待,它“应该”被设计。。。。这只是你的理论。这个答案没有帮助。您应该查看SerialPort类的源代码。