我有一个VB.NET应用程序,通过蓝牙定期与某些设备通信(使用System.IO.Ports.SerialPort
)。定期表示应用程序以1秒的间隔向设备发送请求。
一切都很完美(打开/关闭连接,数据发送/接收)但有一个我不知道要处理的用例。用例是指连接中断(设备已关闭,电池已耗尽,设备已移出范围......)。
如何使用.NET查明连接是否中断是没有办法的。如果设备没有向我的请求发送响应,我认为连接已断开。然后我运行这段代码:
Try
If (sp.IsOpen) Then sp.Close()
Catch ex As Exception
' do something
End Try
当然,属性IsOpen
会返回true
,即使连接已断开,因为它已在物理上断开连接,SerialPort
仅在调用Close()
后才更改属性。所以sp.Close()
被执行但它当然会触发IOException(没有进程在管道的另一端)。没关系,它由Try-Catch
处理。
问题是,当应用程序尝试关闭连接时,它会冻结几秒钟然后触发异常。有没有办法检查连接是否被破坏以避免冻结应用程序?在我看来,不是一个最好的解决方案来制作一个分离的线程来关闭。我的意见是我应该检查一个串口的状态......谢谢