我编写了一些 C# 代码,通过在端口上发出命令并侦听回复来检查设备是否存在于任何 SerialPort 上。当我只是设置端口速度,打开端口,获取串行流并开始处理时,它的工作时间是 100%。但是,我们的一些设备以不同的速度工作,我正在尝试以不同的速度探测设备以自动协商连接并检测设备的存在。
当我在一个线程中完成所有这些操作时,没有任何问题。但是十速下的3s超时是每个串口30s,可能有几个。因此希望同时探测所有端口。
有时这有效。有时 Vista 蓝屏。当我使用线程同时探测所有端口时,它几乎总是蓝屏。当我强迫一切都在一个线程中运行时,它永远不会发生。
USB 串行 Prolific PL-2303 适配器与 x64 驱动程序一起使用。
@Vinko - 感谢您提供有关阅读小型转储的提示。
据我所知,问题的症结在于,通过从不同的线程启动新的异步 I/O 操作,可以为重叠 I/O 赋予全新的含义,从而在驱动程序内部引发竞争条件。由于驱动程序在内核模式下执行,BLAM!
结语
除了开始之外,不要在回调处理程序之外使用 BeginXxx,并且在调用 EndXxx 之前不要调用 BeginXxx,因为你会在内核模式下运行的驱动程序代码中引发竞争条件。
后记
我发现这也适用于套接字流。