.NET串行端口BeginRead阻止远程桌面会话

时间:2015-08-07 17:55:49

标签: c# vb.net

我正在解决一个应用程序的问题,该应用程序监视应用程序在我尝试关闭时挂起的COM端口。在我自己的机器上它关闭就好了。我正在终端服务器上测试这个应用程序,我有通过远程桌面共享的COM端口。在远程桌面会话中,应用程序无限挂起,无法通过任务管理器“结束进程”关闭。

监控的基本代码结构在vb.net中,我使用的是System.IO.Ports.SerialPort。它使用 SerialPort.BaseStream.BeginRead和SerialPort.BaseStream.EndRead 作为从端口获取信息的方法。它使用带回调的Action无限地调用这些方法,直到发生CancellationToken.IsCancellationRequested来中断进程。

事实证明,当我尝试通过CancellationToken.Cancel()取消循环时,BeginRead方法已经阻塞,我的取消无法通过。我发现内置于SerialPort类的ReadTimeout设置不适用于BaseStream.BeginRead。这只是远程桌面会话中的一个问题。远程服务器的操作系统是 Windows Server 2008 R2 Standard 。我尝试过使用Windows 8操作系统的其他远程服务器,那些没有问题。

1 个答案:

答案 0 :(得分:-1)

在这种情况下,互联网没有帮助,但经过大量的修补后,我发现了一种解决问题的方法。

最后,我需要在调用CancellationToken.Cancel()之前调用 SerialPort.DiscardInBuffer()

希望将来可以帮助其他人。