. net串口BeginRead阻塞远程桌面会话
本文关键字:桌面 会话 程桌面 串口 BeginRead net | 更新日期: 2023-09-27 18:07:05
我正在排除一个应用程序的问题,该应用程序监视一个COM端口,当我试图关闭它时,该应用程序会挂起。在我自己的机器上,它关闭得很好。我正在终端服务器上测试这个应用程序,我有通过远程桌面共享的COM端口。在远程桌面会话期间,应用程序无限挂起,也不能通过任务管理器"结束进程"关闭。
监视的基本代码结构是在vb.net中,我使用System.IO.Ports.SerialPort。它使用SerialPort.BaseStream。BeginRead和serialport . baseststream。EndRead作为从端口获取信息的方法。它使用带有回调的Action无限地调用这些方法,直到出现CancellationToken。发生IsCancellationRequested以中断该进程。
事实证明,当我试图通过CancellationToken.Cancel()取消循环时,BeginRead方法已经阻塞,我的取消无法通过。我发现,ReadTimeout设置内置到SerialPort类并不适用于BaseStream.BeginRead。这只是远程桌面会话中的问题。远程服务器的操作系统为Windows server 2008 R2 Standard。我试过其他安装windows 8操作系统的远程服务器,这些服务器都没有这个问题。
互联网在这种情况下没有帮助,但经过大量的修补,我发现了一个解决问题的方法。
最后,我需要在调用CancellationToken.Cancel()之前调用SerialPort.DiscardInBuffer()。