繁体   English   中英

VB.NET 2005,串行端口,配置问题,Windows CE

[英]VB.NET 2005, Serial port, dispose problem, Windows CE

我为Windows CE编写了应与串行端口一起使用的程序。 我使用对象System.IO.Ports.SerialPort 一切正常,但是当我关闭程序并再次打开它时,我收到错误消息:端口正在使用中! 最后,我写:

port.close()
port.dispose()

如果我添加此:

System.GC.collect() 

..比一切都开始起作用

但是问题是,当为每个端口调用垃圾收集器时,计算机会卡住。 如果我尝试在其他地方使用收集器,则它不会“收集”端口,并且如果程序再次启动,它们看起来就像使用的端口。

有人可以帮忙吗?

这里有一些潜在的可能性。 首先,仅因为您调用Close,并不意味着该端口已被物理释放-即使在C语言中也是如此。这取决于UART的状态以及很大程度上取决于实际驱动程序的编写方式。 从调用Close到释放端口的实际驱动程序可能要花费一些时间。 我相信,这是您实际上看到的,因为您实际上是在手动调用close而不是等待Finalizer销毁Port实例并隐式关闭它-这将花费更长的时间。

当然,这假设您的Close呼叫实际上正在运行。 如果不是,那么您需要了解对象终结处理在托管代码中的工作方式。 这与OOP无关,与内存的管理方式无关。 当一个对象超出范围并且没有更多的根(引用)时,就可以进行收集,但这并不意味着它会立即释放。 实际上,终结器运行可能需要一段时间,特别是如果应用程序继续运行。

拥有端口对象的对象可能没有被处置或仍保留引用。 那可以解释为什么在system.gc.collect()之后它可以工作。

在关闭和打开之间,您需要等待多长时间? 根据MSDN

对于任何应用程序,最佳做法是在调用Close方法之后等待一段时间,然后再尝试调用Open方法,因为端口可能不会立即关闭。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM